基于ARM-Linux嵌入式系统的多进程并发服务器设计
client_addr,sizeof(struct sockaddr_in)); client_addr.sin_family=AF_INET; client_addr.sin_port=htons(MY_PORT); client_addr.sin_addr.s_addr=htonl(INADDR_ANY); 为了给调用socket0函数产生的套接字分配一个本地协议地址,建立地址与套接字的对应关系,就要用到绑定函数bind0。通过绑定后端口号保证了地址信息的唯一性。如失败返回-1。 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平台上运行,实现了小型嵌入式服务器的制作。这种低成本、低噪声、低功耗、高稳定性、高安全性的嵌入式服务器,将在我们信息化发展中的智能楼宇、智能家电、智能移动设备中获得应用。 
物联网 ARM-Linux嵌入式系统 多进程并发服务器 相关文章:
- 基于DSP的车辆碰撞声检测装置的设计 (08-29)
- 基于物联网的导航门牌设计(11-24)
- 英特尔推出面向工业系统的虚拟化平台系列(02-24)
- Sentry安全模块全面确保安全性和可靠性(07-04)
- 智能互连的物联网边缘节点的真正安全(06-13)
- 一文看懂物联网起源及应用发展大趋势(01-17)
