找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6827|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

UDP發(fā)送數(shù)據(jù)包,注意IP校驗和

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82781 發(fā)表于 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.    發(fā)送UDP數(shù)據(jù)包
  12.   指定目標IP,本地IP,本地端口,目標端口
  13.   還有數(shù)據(jù)大小,什么數(shù)據(jù),第幾個包
  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數(shù)據(jù)
  20.         uchar UDP_Send_Data_length UDP數(shù)據(jù)長度
  21. **********************************/
  22. //Send_UDP_packet( ); //應(yīng)答
  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定義一個結(jié)構(gòu)體頭
  32. TypeDef_IP_Frame_H  xdata  IP_Frame_H; //IP定義一個結(jié)構(gòu)體頭
  33. TypeDef_UDP_Frame_H xdata  UDP_Frame_H;//UDP定義數(shù)據(jù)結(jié)構(gòu)  
  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);//設(shè)置UDP相關(guān)參數(shù)
  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.       //數(shù)據(jù)長度,
  56.    /*這個長度等于IP部首20字節(jié)+UDP部首8字節(jié)+UDP數(shù)據(jù),這里是1字節(jié)*/
  57.   IP_Frame_H.IP_Total_Length[0]=0;//設(shè)置總長度
  58.   IP_Frame_H.IP_Total_Length[1]=0x1d;//設(shè)置總長度  //29字節(jié)
  59.   /*計算IP部首校驗和**/
  60.   IP_Frame_H.IP_Check_sum[0]=0;
  61.   IP_Frame_H.IP_Check_sum[1]=0; //先設(shè)置為0        
  62.    
  63.   
  64. msb=IP_Frame_H.IP_Version_Head; //IP的版本號和IP的部首長度,默認為0X45,版本是4,部首是20字節(jié)
  65.     msb=msb<<8;
  66. lsb=IP_Frame_H.IP_Tos; //ip的TOS據(jù)我抓包觀察一般是00
  67. tab[0]=msb+lsb;
  68. msb=IP_Frame_H.IP_Total_Length[0];//總數(shù)據(jù)報文長度
  69. msb=msb<<8;
  70. lsb=IP_Frame_H.IP_Total_Length[1];//總數(shù)據(jù)報文長度
  71. tab[1]=msb+lsb;
  72. msb=IP_Frame_H.IP_Indentification[0];//IP標識字段,標識字段唯一地標識主機發(fā)送的每一份數(shù)據(jù)報。通常每發(fā)送一份報文它的值就會加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; //協(xié)議類型
  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++)  //等到多數(shù)據(jù)寫入時采用的測試只發(fā)送一個字節(jié)
  131.    UDP_Frame_H.UDP_Data[0]=UDP_Send_Data[0];//數(shù)據(jù)寫入

  132. /*              物理操作            */
  133. set_send_buffer_add(0x0200,0x023f);//緩沖區(qū)的大小設(shè)定,開始200結(jié)束1fff

  134. write_buffer_add(0x0200,0x0e);//控制字節(jié)
  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.     //數(shù)據(jù)
  182. write_buffer_add(0x022B,UDP_Frame_H.UDP_Data[0]);
  183. write_ENC28J60_REG_SPI(ECON1,0x0c);//允許發(fā)送,允許接收
  184.   for(;;)
  185.   {

  186.    d=read_ENC28J60_REG_SPI(EIR);//讀取數(shù)據(jù)包接收標志位
  187.    if((d&0x08)==0x08)break;  //發(fā)送完畢??OK退出ifNO死在里面
  188.   
  189.      }   




  190. }
  191. /*****************************
  192. 只有接收到一個請求后才會
  193. 發(fā)送一個arp應(yīng)答數(shù)據(jù)包,
  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;  //定義兩個類型結(jié)構(gòu)變量
  206.   /*傳遞了兩個結(jié)構(gòu)傳遞過去,設(shè)置完了在回來用
  207.   也是我頭回用結(jié)構(gòu)做程序
  208.   */
  209. ARP_Frame_Set(&ARP_Frame,&MAC_Frame_H);//加載ARP數(shù)據(jù)包
  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.         /*發(fā)送者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);//緩沖區(qū)的大小設(shè)定,開始200結(jié)束1fff

  235. write_buffer_add(0x0200,0x0e);//控制字節(jié)
  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);//允許發(fā)送,允許接收
  280.   for(;;)
  281.   {

  282.    d=read_ENC28J60_REG_SPI(EIR);//讀取數(shù)據(jù)包接收標志位
  283.   //SendOneByte(d);調(diào)試
  284.    if((d&0x08)==0x08)break;  //發(fā)送完畢??OK退出ifNO死在里面
  285.   
  286.      }   
  287.    
  288. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表