您当前的位置:五五电子网电子知识单片机-工控设备源码-程序uIP各部分协议代码的分析 正文
uIP各部分协议代码的分析

uIP各部分协议代码的分析

点击数:7122 次   录入时间:03-04 11:57:49   整理:http://www.55dianzi.com   源码-程序

  而UIP_APPCALL()又在httpd.h定义如下:

  在httpd.c文件中应用程序函数为:

  因此程序在编译时将UIP_APPCALL替换为httpd_appcall,uip_process()函数中的UIP_APPCALL()被替换为httpd_appcall()。之所以要这么做,是因为当使用另外一个应用程序时,直接将UIP—APPCALL定义为应用程序的函数名称即可。注意,uIP的应用程序只能是一个函数,并且该函数不能有形参和返回值。



www.55dianzi.com

  接下来函数的作用是检查IP头部的vhl字段的值,该IP包是否是分段的,IP头部的目的IP地址与本机IP地址是否相等,IP头部校验和是否正确等。然后判断上层协议字段,上层协议字段可以是TCP协议、UDP协议(需要根据需要选择了条件编译)和ICMP协议等。
  
  程序依次判断是哪一种协议,是某一种,就跳转到相应的协议处理程序段取处理。下面只对TCP处理程序部分作说明。
  
  程序跳转到TCP输入处理程序部分后,首先检查TCP校验和是否正确,然后寻找当前连接中的活动连接(连接的地址与数据包中的地址相同),若找到,则跳转到找到连接程序处理部分。若没有找到,这个数据包或者是一个重复的数据包,或者是一个SYN数据包,根据结果跳转到相应的程序处执行。
  
  found_listen程序处理部分。如果数据包符合正在监听的一个连接,则跳转到这部分。首先程序寻找uip_conn[]数组中状态为CLOSED的连接或者TIME_WAIT的连接,并用新的状态等填入这个连接状态。再接着,程序执行到tcp_send_synack部分,将uip_buf缓冲中的要发送的数据包的状态变为SYNACK,然后跳转到tcp_send程序处发送数据。
  
  found如果发现一个活动的连接,则跳转到这部分。检查TCP的数据包RST状态位,顺序号是否正确,如不正确,跳转到tcp_send_ack部分请求发送正确的序列号。然后,检查当前数据包的连接响应是否要有新的数据发送,如果有,做要发送数据的准备。
  
  程序接下来是一个switch循环判断语句,这个语句相当长,功能是判断当前连接的状态,根据各种不同的状态进行相应的处理等。
  
  uip_process()函数的最后是tcp_send_ack,tcp_send_nodata等部分。
  
  u16_thtons(u16_tval)这个函数的作用是实现不同字节格式的转换。根据定义的处理器的大小端格式实现处理器字的格式与网络数据的字格式转换。
  
  (3)其他辅助程序。
  
  uIP还包括一个uip_arch.c文件。其中的函数主要实现数据处理、校验和的计算等。
  
  ①voiduip_add32(u8_t*op32,u16_top16)函数的功能是实现32位数的进位加法。op32是定义的op32[4]数组的首指针。由于op32[4]
  
  中每个元素的类型为8位,因此uIP中用4个元素表示一个32位数。程序实现的功能是实现op32[4]数组表示的32位数与op16表示的16位数相加,结果存放在uip_aCC32[4]这个全局数组表示的32位数中。
  
  ②u16_tuip_chksum(u16_t*sdata,u16_tlen)函数的功能是实现数据的校验,被uip_ipchksum()函数调用。
  
  ③u16_tuipjpchksum(void)函数功能是实现IP头部校验和的实现。
  
  ④u16_tuip_tcpchksum(void)函数功能是计算得到TCP头部的校验和。
  
  (4)uIP应用实例:一个简单的WEBSERVER。
  
  uIP0.9版本中应用程序部分带了一个简单的WEB服务器和只读文件系统,实现了简单的CGI功能。在此对其进行了改造,使其代码更简单、便于理解。关于http协议,请读者参阅相关资料,在此不做说明。程序代码如下:

程序代码

程序代码



上一页  [1] [2] [3] 


本文关键字:暂无联系方式源码-程序单片机-工控设备 - 源码-程序

《uIP各部分协议代码的分析》相关文章>>>