找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6182|回复: 0
打印 上一主题 下一主题
收起左侧

UDP发送数据包,注意IP校验和

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-13 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. 费了好大劲!本来很简单,一个校验擦!
  2. 注意,一定要注意

  3. #include "ARP.h"
  4. #include "IP.H"
  5. #include "UDP.H"
  6. #include "ENC28J60_SPI.h"
  7. #include "ENC28J60_Send_Receive.h"
  8. #include "ENC28J60_Buff_Operation.h"
  9. #include "UART.H"
  10. /*******************************8


  11.    发送UDP数据包
  12.   指定目标IP,本地IP,本地端口,目标端口
  13.   还有数据大小,什么数据,第几个包
  14.         uchar *MAC_Target_add,//MAC地址。一般情况下由ARP计算得出
  15.                         uchar *IP_Source_add,//IP源地址
  16.         uchar *IP_Target_add,//IP目标地址
  17.         uint   UDP_Source_Port,UDP源端口
  18.         uint   UDP_Target_Port,UDP目标端口
  19.         uchar * UDP_Send_Data, UDP数据
  20.         uchar UDP_Send_Data_length UDP数据长度
  21. **********************************/
  22. //Send_UDP_packet( ); //应答
  23. void Send_UDP_packet(   uchar *MAC_Target_add,
  24.         uchar *IP_Target_add,
  25.         uchar *UDP_Source_Port,
  26.         uchar *UDP_Target_Port,
  27.         uchar *UDP_Send_Data,
  28.         uchar UDP_Send_Data_length
  29.        )
  30. {

  31. TypeDef_MAC_Frame_H xdata  MAC_Frame_H;//MAC定义一个结构体头
  32. TypeDef_IP_Frame_H  xdata  IP_Frame_H; //IP定义一个结构体头
  33. TypeDef_UDP_Frame_H xdata  UDP_Frame_H;//UDP定义数据结构  
  34. xdata unsigned long a,b;
  35. xdata uchar i;
  36. xdata uint tab[10];
  37. xdata uint msb,lsb;
  38. xdata uchar  d;
  39. xdata uint da1;
  40. xdata uint da2;
  41. xdata uchar MSB_SUM,LSB_SUM;
  42. UDP_Frame_Set(&MAC_Frame_H,&IP_Frame_H,&UDP_Frame_H);//设置UDP相关参数
  43.      /*MAC目标地址*/
  44.   MAC_Frame_H.Destination_MAC[0]=MAC_Target_add[0];
  45.   MAC_Frame_H.Destination_MAC[1]=MAC_Target_add[1];
  46.   MAC_Frame_H.Destination_MAC[2]=MAC_Target_add[2];
  47.   MAC_Frame_H.Destination_MAC[3]=MAC_Target_add[3];
  48.   MAC_Frame_H.Destination_MAC[4]=MAC_Target_add[4];
  49.   MAC_Frame_H.Destination_MAC[5]=MAC_Target_add[5];
  50.      /*IP目标地址*/
  51.   IP_Frame_H.IP_Dstination[0]=IP_Target_add[0];
  52.   IP_Frame_H.IP_Dstination[1]=IP_Target_add[1];
  53.   IP_Frame_H.IP_Dstination[2]=IP_Target_add[2];
  54.   IP_Frame_H.IP_Dstination[3]=IP_Target_add[3];
  55.       //数据长度,
  56.    /*这个长度等于IP部首20字节+UDP部首8字节+UDP数据,这里是1字节*/
  57.   IP_Frame_H.IP_Total_Length[0]=0;//设置总长度
  58.   IP_Frame_H.IP_Total_Length[1]=0x1d;//设置总长度  //29字节
  59.   /*计算IP部首校验和**/
  60.   IP_Frame_H.IP_Check_sum[0]=0;
  61.   IP_Frame_H.IP_Check_sum[1]=0; //先设置为0        
  62.    
  63.   
  64. msb=IP_Frame_H.IP_Version_Head; //IP的版本号和IP的部首长度,默认为0X45,版本是4,部首是20字节
  65.     msb=msb<<8;
  66. lsb=IP_Frame_H.IP_Tos; //ip的TOS据我抓包观察一般是00
  67. tab[0]=msb+lsb;
  68. msb=IP_Frame_H.IP_Total_Length[0];//总数据报文长度
  69. msb=msb<<8;
  70. lsb=IP_Frame_H.IP_Total_Length[1];//总数据报文长度
  71. tab[1]=msb+lsb;
  72. msb=IP_Frame_H.IP_Indentification[0];//IP标识字段,标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1
  73. msb=msb<<8;
  74. lsb=IP_Frame_H.IP_Indentification[1];
  75. tab[2]=msb+lsb;

  76.    msb=IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[0];//标志位和片偏移
  77.    msb=msb<<8;
  78.    lsb=IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[1];//标志位和片偏移
  79.     tab[3]=msb+lsb;
  80.     msb=IP_Frame_H.IP_TTL; //生存时间
  81.   msb=msb<<8;
  82. lsb=IP_Frame_H.IP_Protocol; //协议类型
  83. tab[4]=msb+lsb;
  84. msb=IP_Frame_H.IP_Check_sum[0];//部首校验和
  85. msb=msb<<8;
  86. lsb=IP_Frame_H.IP_Check_sum[0];//部首校验和
  87. tab[5]=msb+lsb;
  88.     msb=IP_Frame_H.IP_Source[0];//32IP位源地址
  89. msb=msb<<8;
  90. lsb=IP_Frame_H.IP_Source[1];//32IP位源地址
  91. tab[6]=msb+lsb;
  92. msb=IP_Frame_H.IP_Source[2];//32IP位源地址
  93. msb=msb<<8;
  94. lsb=IP_Frame_H.IP_Source[3];//32IP位源地址
  95. tab[7]=msb+lsb;
  96. msb=IP_Frame_H.IP_Dstination[0];//32位IP目标地址
  97. msb=msb<<8;
  98. lsb=IP_Frame_H.IP_Dstination[1];//32位IP目标地址
  99. tab[8]=msb+lsb;
  100. msb=IP_Frame_H.IP_Dstination[2];//32位IP目标地址
  101. msb=msb<<8;
  102. lsb=IP_Frame_H.IP_Dstination[3];//32位IP目标地址
  103. tab[9]=msb+lsb;
  104. /**我操原来是没有清空变量草,费了我一天时间,我说第一次运行正确,其后不对
  105. 没有清零!我擦我操!
  106. 2012年3月7日
  107. 日照高科园
  108. 王均伟*/   
  109.    a=0;
  110.    b=0;
  111.   for(i=0;i<10;i++)
  112.    {
  113.    a=a+tab[i]; //变量加
  114. b=a;//暂存A中
  115. b+=(a>>16)&0x0000ffff; //取高位与地位相加,并且加完了清0高八位
  116. }
  117.     b=~b; //取反
  118. da1=b;
  119. da2=da1;
  120. da2=(da2>>8)&0x00ff;
  121. //da=IP_Check_Sum_Verify(&IP_Frame_H); //计算IP部首校验和
  122. LSB_SUM=da1;
  123. MSB_SUM=da2;
  124. IP_Frame_H.IP_Check_sum[0]=MSB_SUM;
  125. IP_Frame_H.IP_Check_sum[1]=LSB_SUM; //写入IP部首校验和


  126.   UDP_Frame_H.UDP_Source_Port[0]=UDP_Source_Port[0];
  127.   UDP_Frame_H.UDP_Source_Port[1]=UDP_Source_Port[1];//源端口是8080
  128.   UDP_Frame_H.UDP_Dstination_Port[0]=UDP_Target_Port[0];
  129.   UDP_Frame_H.UDP_Dstination_Port[1]=UDP_Target_Port[1];//目标端口是8080
  130. //for(i=0;i<UDP_Send_Data_length;i++)  //等到多数据写入时采用的测试只发送一个字节
  131.    UDP_Frame_H.UDP_Data[0]=UDP_Send_Data[0];//数据写入

  132. /*              物理操作            */
  133. set_send_buffer_add(0x0200,0x023f);//缓冲区的大小设定,开始200结束1fff

  134. write_buffer_add(0x0200,0x0e);//控制字节
  135. //        MAC
  136. write_buffer_add(0x0201,MAC_Frame_H.Destination_MAC[0]);//
  137. write_buffer_add(0x0202,MAC_Frame_H.Destination_MAC[1]);//
  138. write_buffer_add(0x0203,MAC_Frame_H.Destination_MAC[2]);//
  139. write_buffer_add(0x0204,MAC_Frame_H.Destination_MAC[3]);//
  140. write_buffer_add(0x0205,MAC_Frame_H.Destination_MAC[4]);//   MAC目的地址
  141. write_buffer_add(0x0206,MAC_Frame_H.Destination_MAC[5]);//
  142. write_buffer_add(0x0207, MAC_Frame_H.Source_add_MAC[0]);//
  143. write_buffer_add(0x0208, MAC_Frame_H.Source_add_MAC[1]);//
  144. write_buffer_add(0x0209, MAC_Frame_H.Source_add_MAC[2]);//  MAC源地址
  145. write_buffer_add(0x020A, MAC_Frame_H.Source_add_MAC[3]);//
  146. write_buffer_add(0x020B, MAC_Frame_H.Source_add_MAC[4]);//
  147. write_buffer_add(0x020C, MAC_Frame_H.Source_add_MAC[5]);//
  148. write_buffer_add(0x020D, MAC_Frame_H.Type[0]);//   MAC类型
  149. write_buffer_add(0x020E, MAC_Frame_H.Type[1]);//
  150.    

  151.     //IP
  152. write_buffer_add(0x020F,IP_Frame_H.IP_Version_Head);//
  153. write_buffer_add(0x0210,IP_Frame_H.IP_Tos);//
  154. write_buffer_add(0x0211,IP_Frame_H.IP_Total_Length[0]);
  155. write_buffer_add(0x0212,IP_Frame_H.IP_Total_Length[1]);
  156. write_buffer_add(0x0213,IP_Frame_H.IP_Indentification[0]);
  157. write_buffer_add(0x0214,IP_Frame_H.IP_Indentification[1]);
  158. write_buffer_add(0x0215,IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[0]);
  159. write_buffer_add(0x0216,IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[1]);
  160. write_buffer_add(0x0217,IP_Frame_H.IP_TTL);
  161. write_buffer_add(0x0218,IP_Frame_H.IP_Protocol);
  162. write_buffer_add(0x0219,IP_Frame_H.IP_Check_sum[0]);
  163. write_buffer_add(0x021A,IP_Frame_H.IP_Check_sum[1]);
  164. write_buffer_add(0x021B,IP_Frame_H.IP_Source[0]);
  165. write_buffer_add(0x021C,IP_Frame_H.IP_Source[1]);
  166. write_buffer_add(0x021D,IP_Frame_H.IP_Source[2]);
  167. write_buffer_add(0x021E,IP_Frame_H.IP_Source[3]);
  168. write_buffer_add(0x021F,IP_Frame_H.IP_Dstination[0]);
  169. write_buffer_add(0x0220,IP_Frame_H.IP_Dstination[1]);
  170. write_buffer_add(0x0221,IP_Frame_H.IP_Dstination[2]);
  171. write_buffer_add(0x0222,IP_Frame_H.IP_Dstination[3]);

  172.        //UDP
  173. write_buffer_add(0x0223,UDP_Frame_H.UDP_Source_Port[0]);
  174. write_buffer_add(0x0224,UDP_Frame_H.UDP_Source_Port[1]);
  175. write_buffer_add(0x0225,UDP_Frame_H.UDP_Dstination_Port[0]);
  176. write_buffer_add(0x0226,UDP_Frame_H.UDP_Dstination_Port[1]);
  177. write_buffer_add(0x0227,UDP_Frame_H.UDP_Length[0]);
  178. write_buffer_add(0x0228,UDP_Frame_H.UDP_Length[1]);
  179. write_buffer_add(0x0229,UDP_Frame_H.UDP_check_sum[0]);
  180. write_buffer_add(0x022A,UDP_Frame_H.UDP_check_sum[1]);
  181.     //数据
  182. write_buffer_add(0x022B,UDP_Frame_H.UDP_Data[0]);
  183. write_ENC28J60_REG_SPI(ECON1,0x0c);//允许发送,允许接收
  184.   for(;;)
  185.   {

  186.    d=read_ENC28J60_REG_SPI(EIR);//读取数据包接收标志位
  187.    if((d&0x08)==0x08)break;  //发送完毕??OK退出ifNO死在里面
  188.   
  189.      }   




  190. }
  191. /*****************************
  192. 只有接收到一个请求后才会
  193. 发送一个arp应答数据包,
  194. Receive_MAC_Source_add_MAC:源MAC,即本机MAC
  195. Receive_ARP_Frame_sender_IP :本机IP
  196. Receive_ARP_Frame_Target_IP:目标IP
  197. ******************************/
  198. void Send_ARP_Answer_packet(uchar *Receive_MAC_Source_add_MAC,
  199.        uchar *Receive_ARP_Frame_sender_IP,
  200.        uchar *Receive_ARP_Frame_Target_IP
  201.        )
  202. {   
  203.     uchar  xdata d;
  204. TypeDef_ARP_Frame   xdata  ARP_Frame;
  205. TypeDef_MAC_Frame_H xdata  MAC_Frame_H;  //定义两个类型结构变量
  206.   /*传递了两个结构传递过去,设置完了在回来用
  207.   也是我头回用结构做程序
  208.   */
  209. ARP_Frame_Set(&ARP_Frame,&MAC_Frame_H);//加载ARP数据包
  210.       /*mac目标地址*/
  211.     MAC_Frame_H.Destination_MAC[0]=*(Receive_MAC_Source_add_MAC);
  212.     MAC_Frame_H.Destination_MAC[1]=*(Receive_MAC_Source_add_MAC+1);
  213.     MAC_Frame_H.Destination_MAC[2]=*(Receive_MAC_Source_add_MAC+2);
  214.     MAC_Frame_H.Destination_MAC[3]=*(Receive_MAC_Source_add_MAC+3);
  215.     MAC_Frame_H.Destination_MAC[4]=*(Receive_MAC_Source_add_MAC+4);
  216.        MAC_Frame_H.Destination_MAC[5]=*(Receive_MAC_Source_add_MAC+5);
  217.         /*发送者IP*/
  218. ARP_Frame.sender_IP[0]=Receive_ARP_Frame_Target_IP[0];
  219. ARP_Frame.sender_IP[1]=Receive_ARP_Frame_Target_IP[1];
  220. ARP_Frame.sender_IP[2]=Receive_ARP_Frame_Target_IP[2];
  221. ARP_Frame.sender_IP[3]=Receive_ARP_Frame_Target_IP[3];
  222.       /*mac目标*/
  223. ARP_Frame.Target_MAC[0]=*(Receive_MAC_Source_add_MAC);
  224. ARP_Frame.Target_MAC[1]=*(Receive_MAC_Source_add_MAC+1);
  225. ARP_Frame.Target_MAC[2]=*(Receive_MAC_Source_add_MAC+2);
  226. ARP_Frame.Target_MAC[3]=*(Receive_MAC_Source_add_MAC+3);
  227. ARP_Frame.Target_MAC[4]=*(Receive_MAC_Source_add_MAC+4);
  228. ARP_Frame.Target_MAC[5]=*(Receive_MAC_Source_add_MAC+5);
  229.      /*目标IP*/
  230. ARP_Frame.Target_IP[0]=Receive_ARP_Frame_sender_IP[0];
  231. ARP_Frame.Target_IP[1]=Receive_ARP_Frame_sender_IP[1];
  232. ARP_Frame.Target_IP[2]=Receive_ARP_Frame_sender_IP[2];
  233. ARP_Frame.Target_IP[3]=Receive_ARP_Frame_sender_IP[3];

  234.    set_send_buffer_add(0x0200,0x023f);//缓冲区的大小设定,开始200结束1fff

  235. write_buffer_add(0x0200,0x0e);//控制字节
  236. write_buffer_add(0x0201,MAC_Frame_H.Destination_MAC[0]);//
  237. write_buffer_add(0x0202,MAC_Frame_H.Destination_MAC[1]);//
  238. write_buffer_add(0x0203,MAC_Frame_H.Destination_MAC[2]);//
  239. write_buffer_add(0x0204,MAC_Frame_H.Destination_MAC[3]);//
  240. write_buffer_add(0x0205,MAC_Frame_H.Destination_MAC[4]);//   MAC目的地址
  241. write_buffer_add(0x0206,MAC_Frame_H.Destination_MAC[5]);//
  242. write_buffer_add(0x0207, MAC_Frame_H.Source_add_MAC[0]);//
  243. write_buffer_add(0x0208, MAC_Frame_H.Source_add_MAC[1]);//
  244. write_buffer_add(0x0209, MAC_Frame_H.Source_add_MAC[2]);//  MAC源地址
  245. write_buffer_add(0x020A, MAC_Frame_H.Source_add_MAC[3]);//
  246. write_buffer_add(0x020B, MAC_Frame_H.Source_add_MAC[4]);//
  247. write_buffer_add(0x020C, MAC_Frame_H.Source_add_MAC[5]);//
  248. write_buffer_add(0x020D, MAC_Frame_H.Type[0]);//   MAC类型
  249. write_buffer_add(0x020E, MAC_Frame_H.Type[1]);//
  250.    
  251. write_buffer_add(0x020F,ARP_Frame.Hardware_type[0]);//
  252. write_buffer_add(0x0210,ARP_Frame.Hardware_type[1]);//
  253. write_buffer_add(0x0211,ARP_Frame.Protocol_type[0]);
  254. write_buffer_add(0x0212,ARP_Frame.Protocol_type[1]);
  255. write_buffer_add(0x0213,ARP_Frame.Hardware_address_length);
  256. write_buffer_add(0x0214,ARP_Frame.Protocol_address_length);
  257. write_buffer_add(0x0215,ARP_Frame.Operation_code[0]);
  258. write_buffer_add(0x0216,ARP_Frame.Operation_code[1]);
  259. write_buffer_add(0x0217,ARP_Frame.sender_MAC[0]);
  260. write_buffer_add(0x0218,ARP_Frame.sender_MAC[1]);
  261. write_buffer_add(0x0219,ARP_Frame.sender_MAC[2]);
  262. write_buffer_add(0x021A,ARP_Frame.sender_MAC[3]);
  263. write_buffer_add(0x021B,ARP_Frame.sender_MAC[4]);
  264. write_buffer_add(0x021C,ARP_Frame.sender_MAC[5]);
  265. write_buffer_add(0x021D,ARP_Frame.sender_IP[0]);
  266. write_buffer_add(0x021E,ARP_Frame.sender_IP[1]);
  267. write_buffer_add(0x021F,ARP_Frame.sender_IP[2]);
  268. write_buffer_add(0x0220,ARP_Frame.sender_IP[3]);
  269. write_buffer_add(0x0221,ARP_Frame.Target_MAC[0]);
  270. write_buffer_add(0x0222,ARP_Frame.Target_MAC[1]);
  271. write_buffer_add(0x0223,ARP_Frame.Target_MAC[2]);
  272. write_buffer_add(0x0224,ARP_Frame.Target_MAC[3]);
  273. write_buffer_add(0x0225,ARP_Frame.Target_MAC[4]);
  274. write_buffer_add(0x0226,ARP_Frame.Target_MAC[5]);
  275. write_buffer_add(0x0227,ARP_Frame.Target_IP[0]);
  276. write_buffer_add(0x0228,ARP_Frame.Target_IP[1]);
  277. write_buffer_add(0x0229,ARP_Frame.Target_IP[2]);
  278. write_buffer_add(0x022A,ARP_Frame.Target_IP[3]);
  279. write_ENC28J60_REG_SPI(ECON1,0x0c);//允许发送,允许接收
  280.   for(;;)
  281.   {

  282.    d=read_ENC28J60_REG_SPI(EIR);//读取数据包接收标志位
  283.   //SendOneByte(d);调试
  284.    if((d&0x08)==0x08)break;  //发送完毕??OK退出ifNO死在里面
  285.   
  286.      }   
  287.    
  288. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表