3.2 IP地址、端口号的判断及匹配
uip_process函数接收到网络控制芯片驱动程序送来的数据包后,当判断出收到的包是UDP包,执行2.1中的判断并且得到结果为真后,但还需要再做以下工作:如果uip_udp_conn中的目的端口号为0,则说明这是一个来自客户端的首次与服务端进行通信的数据包,服务端尚不知道此客户端的源端口,因此要把uip_udp_conn中的目的端口号设为收到的包中的源端口号,把uip_udp_conn中的目的IP地址设为收到的包中的源IP地址,具体代码如下:
if(uip_udp_conn->rport==0)
{
uip_udp_conn->rport=UDPBUF->srcport; memcpy(uip_udp_conn->ripaddr,UDPBUF->srcipaddr,sizeof(uip_ipaddr_t ));
} 3.3 UDP服务端目的端口的释放
UDP服务端的端口应该可以为来自多个客户端的请求提供服务,而UDP本身是一种无连接的传输层协议,因此在每次uIP作为服务端的UDP通信结束之后,还要释放uip_udp_conn中记录的目的端口号,以便下次接收来自不同IP、不同端口的新请求,否则当来自其他端口的请求到达时,uIP会不予响应。
在uIP的官方网站上下载到uIP 1.0的源代码之后,按照本文给出的几个步骤对uIP 1.0进行改造之后,利用gcc编译器把uIP 1.0编译成S3C2410上的可执行代码,把基于S3C2410的开发板作为UDP服务器,运行Windows XP的PC机作为客户端,两者通过一条交叉网线相联,在PC机上的测试程序发出UDP请求后,运行在S3C2410上的uIP可以对PC通过UDP协议发出的数据进行处理,并给PC作出正确的回复。实验证明,通过对uIP进行本文所述的改进之后,uIP具有了作为UDP服务端的能力。 参考文献
[1] http://www. sics. se/~adam/uip/index. php/Main_Page.
[2] ADAM D. The uIP embedded TCP/IP stack the uIP 1.0 reference manual. June 2006.
[3] ADAM D. Full TCP/IP for 8-bit architectures[C]. In Proceedings of the First International Conference on Mobile Applications, Systems and Services(MOBISYS 2003), San Francisco, May 2003.
[4] ADAM D, OLIVER S, THIEMO V, et al. Protothreads: simplifying event-driven programming of memory-constrained embedded systems[C]. In Proceedings of the Fourth ACM Conference on Embedded Networked Sensor Systems (SenSys 2006), Boulder, Colorado, USA, November 2006.
[5] FOROUZAN B A, FEGAN S C着. TCP/ZP协议簇[M]. 谢希仁等,译.北京:清华大学出版社,2006.