基于ARM-Linux嵌入式系统的多进程并发服务器设计
bind (listen_fd,(struct sockaddr*)client_addr,sizeof(client_addr))
当调用socket0函数创建一个套接字时,默认情况下它是一个主动套接字。所以对于TCP服务器,在绑定操作后,必须要调用listen0函数,将这个未连接的套接字转换。
成被动套接字,使它处在监听模式下,指示内核应接受发向该套接字的连接请求。在调用listen0函数后,服务器的状态从close转换到listen状态。Listen第二个状态字代表的是最大连接数,本系统设置的最大连接数为10。
listen(listen_fd,10);
接受客户连接,客户协议地址和长度省略接收,失败accept_fd=-1,置errno。如果建立连接。并且fork0=0,那么程序就进入子进程进行执行。
accept_fd=accept(listen_fd,NULL,NULL);
清除一个文件描述符集,并将一个新文件描述符加入文件描述符集中,其作用就是更新文件描述符。
FD_ZERO(fds);
FD_SET(aecept_fd,fds);
函数select0是给出每个描述符我们所关心的条件:是否读描述符、是否想写描述符、是否描述符的异常条件。tv指等待时间。FD_ISS ET()测试该集中的一个给定位是否有变化、更新。
retval=select(accept_fd+1,fds,NULL,NULL,tv);
FD_ISSET(accept_fd,fds)
调用read0可以接收buffer数据缓冲区,1 024指接收数据缓冲区大小,n为接收字节数。
n=read(aecept_fd,buffer,1 024);
调用子程序modbus.c,执行相应操作,调用make_modbus_ack0生成回发数据,并通过send0回发给客户端。
send_count=make_modbus_ack(buffer,n);
send(accept_fd,buffer,send_count,0)
3 ARM-Linux多进程服务移植与实现
3.1 程序编译移植
Makefile的作用就是让编译器知道要编译一个文件需要依赖哪些文件,同时当那些依赖文件更新时,编译器会自动发现最终生成的文件已经过时,而重新编译相应模块。Makefile定义了一系列规则来指定各文件,如依赖性、先后顺序及是否需要更新等。
ARM平台上的Makefile
CROSS=arm-linux-
arm-modbus-server.main.c modbus.c
$(CROSS)gcc-o arm-modbus-server main.c modbus.c
clean:
rm-vf*.o
编译译基于ARM的modbus网络程序如下图,首先我们看到文件夹里没有可执行文件arm-modbus-server,输入:#make
执行Makefile文件,进行编译连接依赖文件:main.c、modbus.c、std_c.h。
然后生成我们所需要的文件arm-modbus-server。
3.2 并发服务器测试
本测试是基于ARM9的linux2.9内核平台。首先使用chmod修改arm-modbus-server执行权限,然后运行./arm-modbus-server即服务器程序已经启动。
启用两个客户端通过IP访问服务器,可见如图5所示,已显示并发服务器运行正常。

4 结论
本文详细介绍了并发服务器的原理结构,分析了基于linux下的并发服务器程序代码,并且移植到ARM平台上运行,实现了小型嵌入式服务器的制作。这种低成本、低噪声、低功耗、高稳定性、高安全性的嵌入式服务器,将在我们信息化发展中的智能楼宇、智能家电、智能移动设备中获得应用。
评论