导航:首页 > 操作系统 > linux服务端开发

linux服务端开发

发布时间:2022-06-29 06:27:56

A. linux服务器开发需要哪些知识'

[开发前准备]
在进行linux服务器开发之前,必须很清楚地了解所开发的对象需要考虑的相关问题
比如:
功能架构:提供服务的模块体系结构
稳定性:服务器的出core率,内存泄露情况
性能:请求与返回的速度与正确性
负载能力:能同时访问的最大数量和频度
根据不同服务器对象的环境和应用,服务器开发的对应手段相差甚远。比如就客户端连接时间较短却又比较频繁的服务器(例如HTTP服务器)而言,
在可选的服务器结构中,预先派生进/线程的结构就要比并发式结构高效
总之,在开发服务器之前,必须进行完整的服务器开发需求分析,否则一旦你的服务器开发完成而因为效率或者其他某项事物不能满足你的客户,那么很有可能失败!
[服务器让我明白了这件事情]
服务器一般在后台运行,与客户端的交互通过请求和返回两种方式进行通信。
以epoll为例,一个epoll开发的服务器程序,等待着一百万的客户端用户的请求,轮询观察某个时刻是否有客户端发来的请求;排队依次处理发来的请求,并将结果返回给
客户端应用程序。
涉及到几个技术问题:
第一,客户端访问进入epoll轮询队列的优先级是否需要控制。比如甲是我们的vip白金用户,那么,我始终先处理甲发来的请求,不然白金用户要生气的。
第二,极大可能程度上优化处理请求的速度,这是服务器设计的核心业务。
第三,如果客户端请求了这样一个事情:我需要看这一百年来某企业所有的信息,那么我想这个信息量是很大的,也就是现在很热门的大数据大文件传输问题,如何快速
将服务端的这些结果传给客户端,在带宽允许的情况下当然越快越好!这里会有很多处理措施,当然你可以打成一个包直接扔过去,但是这样是愚蠢的,像蜗牛背着一个
重壳在挪动,用户可等不了这么久;聪明的做法当然很多,根据你的实际需要,比如,你可以压缩,你可以分批,等等。
等等,其实服务器的整个开发,每个细节都决定了你的服务器的成败优劣。在开发linux服务器的项目后,我个人决定,一个让你的服务器变得强大的很重要的因素是——
——你不愿意放弃任何一个可以挺高性能的因素,即使是快0.01ms或者少传1bt的数据!
[流行的服务器模型]
1 PPC/TPC 模型
这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我 。只是 PPC 是为它开了一个进程,而 TPC 开了一个线程。可是别烦我是有代价的,
它要时间和空间啊,连接多了之后,那么多的进程 / 线程切换,这开销就上来了;因此这类模型能接受的最大连接数都不会高,一般在几百个左右。
2 select 模型
2.1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的 由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Select 模型的最大并发数就被相应限制了。
自己改改这个 FD_SETSIZE ?想法虽好,可是先看看下面吧 …
2.2. 效率问题, select 每次调用都会线性扫描全部的 FD 集合,这样效率就会呈现线性下降,把 FD_SETSIZE 改大的后果就是,大家都慢慢来,什么?都超时了??!!
2.3. 内核 / 用户空间 内存拷贝问题,如何让内核把 FD 消息通知给用户空间呢?在这个问题上 select 采取了内存拷贝方法。
3 poll 模型
基本上效率和 select 是相同的, select 缺点的 2 和 3 它都没有改掉。
4 Epoll 模型
把其他模型逐个批判了一下,再来看看 Epoll 的改进之处吧,其实把 select 的缺点反过来那就是 Epoll 的优点了。
3.1. Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,
具体数目可以 cat /proc/sys/fs/file-max 察看。
3.2. 效率提升, Epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因此在实际的网络环境中, Epoll 的效率就会远远高于 select 和 poll 。
3.3. 内存拷贝, Epoll 在这点上使用了“共享内存 ”,这个内存拷贝也省略了。
等等。
在开发你的服务器之前,应根据自己的业务需求和实际情况,恰当地选择服务器的模型,这对这个服务器的功能效率都是具有很重要的意义的

B. 软件开发,做linux下的C语言有前途呢还是做window下的c++,VC++,MFC之类的有前途请教各位行业达人精英

linux 下的c和c++开发一般不依赖某个IDE环境,一般直接用底层函数,能更好的积累c知识;
windows下的业务软件开发更多的侧重业务经验,技术积累不多,虽然应用广,但做不深;
如果决心在技术领域钻研建议选linux多研究c,如果自己特点侧重业务而结合技术,那么windows下开发也挺好,但要特别注意积累业务只是和经验。

linux下的开发一般分为三种:
1。linux服务端程序开发;
做这个需要较深的积累和持续的新技术学习,上手容易,深入难,应用面有一点窄,如果能做到高级非常吃香,因为这样的开发都是一个持续服务性系统的基石,一般用c语言;再往上发展可以做架构师。
2。linux嵌入式开发(包括底层驱动);
目前应用比较多的linux开发,但是不如linux服务端开发有深度。
3。界面等相关开发。
应用不多,没多大技术含量,适合有美术功底的人。

具体做哪个合适要根据自己的性格特点来定,无论是哪个坚持做好都不错;但个人认为做linux服务端开发有挑战、有技术深度、有职业发展深度。

C. linux是什么培训完linux之后我们可以做什么

Linux是什么?

云计算是一个模型,这个模型可以方便地按需访问一个可配置的计算资源(例如,网络、服务器、存储设备、应用程序以及服务)的公共集。这些资源可以被迅速提供并发布,同时最小化管理成本或服务提供商的干涉。云模型由五个基本特征、三个服务模型和四个发布模型组成。

Linux云计算培训课程围绕现代数据中心运维常用技术展开,最后逐渐过渡到云数据中心运维与开发技术。课程分传统数据中心运维技术与云数据中心运维技术两大部分。其中传统数据中心运维主要涵盖了:

1、 计算机网络软、硬件技术

2、 Linux操作系统基础与运维

3、数据库管理与运维技术

云数据中心运维主要包括:

1、虚拟化技术

2、企业私有云平台运维技术

3、主流云平台框架

4、 容器云技术

除此之外,还包括数据中心运维自动化部分,该部分主要涉及Shell脚本编程与Python程序设计等与运维开发相关的技术与技能。

Linux培训完之后都可以做什么?

Linux学成之后就业方向还是挺广泛的,多种岗位,多种领域,多栖发展,其就业方向主要有:

1、Linux云计算方向

2、DBA方向

3、网络安全方向

4、系统运维方向

5、Python运维开发方向

具体的岗位有云计算工程师、数据库运维工程师、安全运维工程师、Python运维开发工程师、安全专家、高级数据库工程师等等,都可以胜任这些岗位。

D. 运维和unix/linux服务器端开发一样吗

1、unix/linux网络编程是一类编程技术(一般指socket相关的编程)。 2、unix/linux服务器是一种服务系统(它是指向客户端提供某种服务的一套应用系统,如ftp服务器、http服务器等)。 3、unix/linux服务器的开发(一套应用系统的开发)通常要用...

E. linux开发工程师开发什么的

一:C语言:嵌入式Linux开发工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域重要也是主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。
二:Linux基础:Linux操作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建。
三:Linux系统编程:重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。
四:Linux网络编程:计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,Javascript等Web编程技术及实现方法。
五:数据结构与算法:数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。
六:C++ 、QT:C++是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。
七:Cortex A8 、Linux 平台开发:通过基于ARM Cortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nand flash控制器等模块,为底层平台搭建做好准备。Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。同时了解Android操作系统开发流程。Android系统是基于Linux平台的开源操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。
八:驱动开发:驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。本阶段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARM Cortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。
以上内容就是linux开发工程师主要会干什么,看上去挺多的吧。事实上linux的学习是一步一步循序渐进的,慢慢的就会发现,一切都顺理成章。还在犹豫要不要学习?赶紧开始吧!
更多Linux知识可参考《Linux就该这么学》。

F. 在linux操作系统下进行web开发,目前有哪些动态主页技术可以选择

CGI :最早实现的动态WEB技术,可以采用任何语言实现(C ,VB),但是这种传统的CGI程序本身采用多进程的机制处理的,每当一个新用户连接服务器时都会分配一个新进程 很明显执行效率很低 php: 这是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,JAVA和PERL语言的语法,并结合自身的特性,是WEB开发者能够迅速地写出动态页面。 Asp: 这是一个动态服务器端的开发环境利用它可以产生和运行动态的,交互的,高性能的WEB服务应用程序。ASP采用脚本语言VBS和JAS作为开发语言。 ASP.NET:这个事微软公司继ASP之后推出的新一代动态网站开发技术。ASP.NET基于.NET框架平台,用户可以选择.NET框架下自己喜欢的语言进行开发。ASP.NET技术是ASP技术的更新,也是微软公司目前主推的技术。但是由于微软的产品永远都会受到平台的限制。往往只已用于小型开发。 JSP:使用JAVA完成的动态WEB开发,代码风格和ASP类似,都属于在HTML代码中嵌入JAVA代码以实现功能,由于JAVA语言的跨平台特性,所以JSP不会受到操作系统或开发平台的制约,而且有多种服务器可以支持,如Tomcat WebLgic JBoss Websphere等,所以经常在大型开发中使用。

G. 怎么用linux系统做服务器

1、安装ftp服务端,方便你从客户端上传文件。linux上一般安装vsftp.

VSFTP的软件安装包是: vsftpd-2.2.2-12.el6_5.1.i686.rpm
查询:#rpm -q vsftpd
安装:#rpm -ivh vsftpd-2.2.2-12.el6_5.1.i686.rpm或者直接yum install vsftpd
启动、停止及重启VSFTP的命令: #service vsftpd start/stop/restart

配置文件:
/etc/vsftpd/vsftpd.conf //主配置文件
/etc/vsftpd.ftpusers //被禁止登录FTP的用户文件
/etc/vsftpd.user_list //允许登录FTP的用户文件

a、将登录后的用户限制在本地家目录下:
#vi /etc/vsftpd/vsftpd.conf
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
新建受限用户的列表文件并加入受限用户名

#vi /etc/vsftpd.chroot_list
raykeso

重启ftp服务
#service vsftpd restart

2、安装apache,开启目录索引,这样你就可以浏览和下载文件。

apache配置文件
<Directory"I:/build/dist"> #设置浏览文件的目录
Options Indexes#开启目录列表索引模式Order allow,deny
Allow from all
</Directory>

H. linux服务端开发是用C还是C++

一般的服务器,大都属于应用领域。在Linux/UNIX的应用领域搞开发,还是C++多一些,毕竟开发效率高、维护成本低。但是靠近底层的部分,如内核、驱动等方面的开发,还是C语言的天下。

I. linux开发要学什么

第一条:运维应用-->系统架构-->运维开发-->系统开发
第二条:运维应用-->应用dba-->架构dba-->开发DBA
下面详细每个阶段的职位说明:
01.运维应用级别:
这个阶段就是玩别人的软件,例如:linux,nginx,mysql,php,nagios 大多数的linux运维工程师,网络工程师,系统工程师都是这个阶段。 这个阶段属于金字塔的底端,工资是相对比较低的。
02.系统架构级别:
这个阶段就是用已知软件架构大规模集群方案以及实现各种技术方案,属于运维应用上层,需要靠技术,沟通,思想三条线通力配合才能达到这个水平。
03.运维开发级别:
这个阶段就是利用已知语言,开发基本的应用层工具,例如:web管理系统,如果具备前两个运维应用和系统架构的积淀,这个是很轻松可以实现的。
04.系统开发级别:
这个阶段就是修改开源的软件,或者开发新的服务软件(例如:也开发一个web软件,存储软件)与底层软件(例如:OS),是更高一层的开发人员。
05.数据库管理和架构:
这个阶段就是也主要是玩别人的软件,但是数据相对更重要,要求有一定的运维应用的能力。
以上是常规的Linux发展路线,对于想学Linux运维,或正处于Linux运维相关工作的人员,可以根据自身的情况进行定位,选择适合自己的发展路线,往往可以在职场上更加得心应手!

J. 如何实现在Linux下创建服务程序

Linux系统能提供强大可靠的网络服务,并有管理程序对服务进行管理。例如我们熟悉的Web、FTP和电子邮件等,它们既可以单独运行,也可以被守护进程inetd调用,而且运行得都非常好。但我们不能仅停留在赞叹中,下面就给出两个服务程序程序和一个客户程序的例子,介绍服务程序和客户程序之间是如何沟通的。另外还要编辑配置一些文件,让服务程序也能接受服务管理程序管理。

这两个服务程序功能相同,但一个是独立服务程序,另一个是被inetd调用的服务程序。这是TCP/IP网络服务的两大类,这里将两个程序放在一起是为了比较程序结构和运行方式。两服务程序都在Red Hat Linux 7.1和TurboLinux 7.0上调试通过。

独立服务器

TCP和UDP是两大TCP/IP数据传输方式,套接口是建立服务器客户机连接的机制,首先介绍它们建立通信联系的过程,然后给出一个TCP服务程序例子。

1.TCP套接口通信方式

对于TCP服务器端,服务程序首先调用建立套接口的函数socket(),然后调用绑定服务IP地址和协议端口号函数bind()。绑定成功后调用被动监听函数listen()等待客户连接,还要调用获取连接请求函数accept(),并一直阻塞到客户连接请求的到达,这个函数获取客户机IP地址和协议端口号。

对于TCP客户端,客户程序启动后后调用建立套接口函数socket(),然后调用连接函数connect(),此函数与服务器通过三次握手建立连接。

服务器和客户机建立连接后,就可以使用读函数read()和写函数write()收发数据了。数据交换完成后便各自调用关闭套接口函数close()删除套接口。TCP套接口通信方式见图1所示。

图1 TCP套接口通信方式

2.UDP套接口通信方式

UDP程序与TCP的区别是无需建立连接。服务器首先启动,然后等待用户请求。客户机启动后便直接向服务器请求服务,服务器接到请求后给出应答。

对于UDP服务器端,服务程序首先调用套接口函数socket(),然后调用绑定IP地址和协议端口号函数bind()。之后调用函数recvfrom()接收客户数据,调用sendto()向客户发送数据。

对于UDP客户端,客户机程序启动后调用套接口函数socket(),然后调用sendto()向服务器发送数据,调用recvfrom()接收服务器数据。

双方数据交换成功后,各自调用关闭套接口函数close()关闭套接口。UDP套接口通信方式见图2所示。

图2 UDP套接口通信方式

下面给出独立服务程序的例子。这个程序虽然简单,但是与复杂程序有着相同的结构。

//程序名:server.c
//功能:服务器从客户机读入一个字符,并将排在此字符后面的字符回送客户机
//服务器端口:9000
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int pid; //用于存放fork()执行结果
int server_sockfd,client_sockfd; //用于服务器和客户机套接口描述符
int bind_flag,listen_flag; //用于存放bind()和listen()执行结果
int server_address_length,client_address_length; //作为服务器客户机地址长变量
struct sockaddr_in server_address; //作为服务器地址结构变量(含地址和端口)
struct sockaddr_in client_address; //作为客户机地址结构变量(含地址和端口)
if((pid=fork())!=0) //用fork()产生新进程
exit(0) ;
setsid() ; //以子进程开始下面的程序

函数socket(),创建一个套接口,成功则返回套接口描述符。

server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(server_sockfd<0)
{
printf(“socket error /n”);
exit(1);
}
server_address.sin_family=AF_INET;

函数htonl()用于将32位主机字节顺序转换为网络字节顺序,其中参数INADDR_ANY表示任何IP地址。

server_address.sin_addr.s_addr=htonl(INADDR_ANY);

函数htons()用于将16位主机字节顺序转换为网络字节顺序,其中的参数是绑定的端口号,读者可根据环境自行改动,目的是不与其它服务端口冲突。

server_address.sin_port=htons(9000);
server_address_length=sizeof(server_address);

函数bind()用于绑定本地地址和服务端口号,若调用成功返回值为0。

bind_flag=bind(server_sockfd,/
(struct sockaddr *)&server_address,/
server_address_length);
if(bind_flag<0)
{
printf(“bind error /n”);
exit(1);
}

函数listen(),指明服务器的队列长度,被动等待客户连接,调用成功返回值为0。

listen_flag=listen(server_sockfd,5);
if(listen_flag<0)
{
printf(“listen error /n”);
exit(1);
}

while(1)
{
char ch;

函数accept()等待和获取用户请求,为每个新连接请求创建一个新的套接口,调用成功返回新套接口描述符。

client_sockfd=accept(server_sockfd,/
(struct sockaddr *)&client_address,/
&client_address_length);

函数read()和write()用于在服务器和客户机之间传送数据,调用成功返回读和写的字节数。

函数close(),用于程序使用完一个套接口后关闭套接口,调用成功返回值0。其中的参数为accept()创建的套接口的描述符client_sockfd。

read(client_sockfd,&ch,1);
printf(“cli_ch=%c”,ch);
ch++;
write(client_sockfd,&ch,1);

close(client_sockfd);
}
}

程序完成后就可以使用命令进行编译。在命令行中输入“gcc -o server server.c”,将server.c编译成可执行程序server,这时便可用客户程序进行测试。在命令行执行“./server”启动服务程序,执行“netstat -na”查看有无server的服务端口。如果存在,则执行下面编写的客户程序“./client”。不过这仅是手工启动的方法,下面给出用服务管理程序管理server程序的方法。只要在目录/etc/rc.d/init.d下放入服务程序的脚本就能被服务程序读到。在命令行执行“touch server”创建文件server,并将文件属性改成可执行。在管理程序中并不能看到此服务名,脚本文件必须有一些结构才能被管理程序认为是服务程序脚本。

为了减少工作量,拷贝/etc/rc.d/init.d下脚本httpd,将拷贝脚本名命名为server,然后对其编辑。

(1)执行“cp httpd server”。

(2)用文本编辑器vi(其它编辑器亦可)将server打开进入编辑状态。首先用字符串server替换httpd。然后找到daemon server行,如果编写的程序放在变量PATH目录中,不需要修改此行;如果把服务程序放在其它目录中,就要写服务的全路径。例如程序在/root的目录中,就要写成daemon /root/server,还要删除“rm -f /var/run/server.pid”这一行。

(3)执行“chmod 755 server”,将server属性设定为可执行。

此时就可以用chkconfig、ntsysv等工具,在希望的运行级中增加这个新服务程序,然后测试客户机与服务器能否通信。

被xinetd调用的服务程序

在Linux系统中,有很多服务是被xinetd(较早版本使用的是inetd)超级守护服务器启动的。其实凡是基于TCP和UDP的服务都可使用超级守护进程启动,只是在服务量很大影响效率的情况下不被采用。

1.依赖xinetd启动的服务建立通信过程

为了与独立服务器程序比较,我们看一下依赖xinetd的服务器是如何启动的。

(1)xinetd启动时读取/etc/xinetd目录中的文件(早期版本为/etc/inetd文件),根据其中的内容给所有允许启动的服务创建一个指定类型的套接口,并将套接口放入select()中的描述符集合中。

(2)对每个套接口绑定bind(),所用的端口号和其它参数来自/etc/xinetd目录下每个服务的配置文件。

(3)如果是TCP套接口就调用函数listen(),等待用户连接。如果是UDP套接口,就不需调用此函数。

(4)所有套接口建立后,调用函数select()检查哪些套接口是活动的。

(5)若select()返回TCP套接口,就调用accept()接收这个连接。如果为UDP,就不需调用此函数。

(6)xinetd调用fork()创建子进程,由子进程处理连接请求。

◆ 子进程关闭所有其它描述符,只剩下套接口描述符。这个套接口描述符对于TCP是accept()返回的套接口,对于UDP为最初建立的套接口。然后子进程连续三次p()函数,将套接口描述符复制到0、1和2,它们分别对应标准输入、标准输出和标准错误输出,并关闭套接口描述符。

◆ 子进程查看/etc/xinetd下文件中的用户,如果不是root用户,就用调用命令setuid和setgid将用户ID和组ID改成文件中指定的用户。

(7)对于TCP套接口,与用户交流结束后父进程需要关闭已连接套接口。父进程重新处于select()状态,等待下一个可读的套接口。

最后调用配置文件中指定的外部服务程序,外部程序启动后就可与用户进行信息传递了。

2.为xinetd编写专门的服务程序

除了独立服务程序能被xinetd启动外,还可以为xinetd编写专门的程序。此处的例子程序与上面server.c功能相同。不过两者的程序区别是很大的,此例的代码仅相当于上面传输数据的部分。我们还将程序名定为server.c,所以不能放在相同目录中,同名仅是为了和上面程序对照。

#include "unistd.h"
int main()
{
char ch;
read(0,&ch,1);
ch++;
write(1,&ch,1);
}

将程序编译成可执行文件,并做些设置就可被xinetd启动。注意不要和上面的独立服务程序server一起启动,因为客户程序写得比较简单,访问的是固定端口,服务器都设成了相同的端口号。

(1)编辑/etc/services文件,在行末增加一条记录:

server 9000/tcp

(2)在目录/etc/xinetd.d下编写文件server,内容为:

service server
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /home/test/server (此处设置成自己程序所在的目录)
}

如果使用的是较早版本,则需在/etc/inetd.conf文件中添加下面的行:

server tcp nowait root /path/to/yourdirectory/server

(3)执行/etc/rc.d/initd.d/xinetd restart重新启动xinetd服务器。早期版本执行/etc/rc.d/initd.d/inetd restart重新启动inetd。

(4)执行netstat -an查看有没有server程序使用的端口号,如果有就可使用下面客户机程序进行测试了。

客户机程序

下面就客户机函数做一简单介绍。

//程序名client.c
/*功能:从客户的控制台输入一个字符,然后将这个字符送到服务器,并将服务器返回的字符显示出来*/
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int sockfd;//
int address_len;
int connect_flag;
struct sockaddr_in address;
int connect_result;
char client_ch,server_ch;

函数socket()用于建立一个套接口,创建成功返回套接口描述符。

sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf(“sockfd error /n”);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(“192.168.0.1”);/*读者根据自己环境改成服务器地址*/
address.sin_port=htons(9000);

address_len=sizeof(address);

函数connect()用于与服务器建立一个主动连接,调用成功返回值为0。

connect_flag=connect(sockfd,(struct sockaddr *)&address,address_len);

if(connect_flag==-1)
{
perror(“client”);
exit(1);
}
printf(“Input a character :”);

函数scanf()用于从控制台输入一个字符,并将字符存入client_ch的地址。函数write()和read()用于传输数据。函数printf()在客户机屏幕上显示服务器传回的字符。函数close()关闭套接口。

scanf(“%c”,&client_ch);
write(sockfd,&client_ch,1);
read(sockfd,&server_ch,1);
printf(“character from server : %c/n”,server_ch);
close(sockfd);
exit(0);
}

执行命令“gcc -o client client.c”,将client.c编译成client。执行“./client”,在程序提示下输入一个字符,就能看到服务器传回的字符。

以上介绍的仅是简单的例子。平时见到的服务程序远比它复杂,而且很多是多协议服务程序或是多协议多服务程序。多协议服务程序就是在main()中分别创建供服务的TCP和UDP套接口。为每个服务分别写出相应程序好处是便于控制,但是这样每个服务都启动两个服务器,而它们的算法响应是一样的,就要耗费不必要的资源,并且出了问题排错也较困难。多服务是将不同的服务集成在一起由一个程序完成,可用一个数组表示服务,数组中的每一项表示某协议某服务的一种,这样很容易扩展程序的服务功能。

阅读全文

与linux服务端开发相关的资料

热点内容
战双程序员 浏览:479
him触摸编程软件 浏览:929
植物大战僵尸存档怎么转移安卓 浏览:852
java栈的元素 浏览:737
程序员与篮球事件 浏览:675
app反编译不完整 浏览:788
电脑上的文件夹怎么调整 浏览:7
服务器无响应是什么原因呀 浏览:984
wd文档里的app怎么制作 浏览:513
电脑里的文件夹没有了一般能恢复吗 浏览:418
哪里有配加密钥匙的 浏览:210
服务器开不了机怎么把数据弄出来 浏览:958
gif动态图片怎么压缩 浏览:521
黑猴子棒球压缩文件解压密码 浏览:631
如何让app适应不同的手机屏幕大小 浏览:10
苹果手机如何给安卓手机分享软件 浏览:761
苹果电脑怎么运行腾讯云服务器 浏览:59
明日之后沙石堡命令助手 浏览:261
蛋糕店用什么样的app 浏览:877
长安银行信用卡app怎么取现 浏览:635