找回密码
 立即注册

QQ登录

只需一步,快速开始

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

嵌入式的TCP+IP协议的完整C源程序

[复制链接]
跳转到指定楼层
楼主
做一个项目涉及到的tcp/ip 源代码




所有资料51hei提供下载:
TCP IP协议的完整C源程序.rar (26.62 KB, 下载次数: 26)


源程序如下:

  1. // 版权 2003, 王卫无,四川绵阳岷山集团有限公司--研究开发中心
  2. // wolver@minshan-inc.com
  3. // 保留一切权利
  4. //
  5. // 如果符合以下条件,则无论是以原代码或非原代码代码形式,且不论是否修改,
  6. // 再分发和使用本软件都是被允许的。
  7. // 1. 原代码的再分发必须保留上述的版权声明、本条件说明和以下免责声明。
  8. // 2. 非原代码形式的再分发,必须在证明文件和(或)其它一同提供的材料中重新
  9. //    作上述的版权声明、本条件说明和以下免责声明。
  10. // 3. 一切提及本软件和使用的广告材料必须显示以下致谢:
  11. //    本产品包含王卫无(四川绵阳岷山集团有限公司--研究开发中心)开发的软件。
  12. // 4. 如果没有预先得到特定的书面许可,不能用作者的名字来宣传推广基于本软件得到
  13. //    的产品。
  14. //
  15. // 免责声明:
  16. // 本软件是由某某作者提供,如果出现以下情况,作者都不承担任何责任。
  17. // 1. 因作者的说明以及任何明确的或暗示的保证(包括但不限于表达某种商业性和适合某一
  18. //    特定目的暗示性保证)而产生的损失。
  19. // 2. 无论在何种情况下,对使用本软件造成的任何直接的、间接的、偶然的、特定的、可预
  20. //    见性的和连带产生的损失(包括但不限于获取产品和服务、作用丧失、数据遗失、利益损
  21. //    失或商业干预),无论这些损失是怎样造成的,并且是以何种方式阐释责任。
  22. // 3. 任何因使用本软件而相关的合同、严格赔偿责任和侵权行为(包含:疏忽或其它)的损失,
  23. //    甚至即便是可能的此类已经明示或暗示的损失。
  24. ///


  25. #include "system.h"
  26. #include "tcpip.h"
  27. #include "drivers.h"

  28. // 定义应用:1 表示开启功能,0 表示关闭功能
  29. #define cTCP_RS232   1    // TCP <-> RS232 的应用,只用于服务模式
  30. #define cTCP_ADAC    1    // TCP <-> Audio, 主要用于服务,也可以用于客户。要求高带宽: > 912Kbit



  31. // 分配本地用户自定义服务模式应用TCP端口号,不能与知名端口相同!如:23, 80
  32. // 注意:对不同的TCP事件使用不同的本地端口号,有助于快速查找TCP事件而不需要判断IP是否相同!
  33. //       这样做能使本地快速响应。
  34. #define cTCP_ListenPort_TEST   0x1000   // 4096

  35. #if cTCP_RS232 == 1
  36. #define cTCP_ListenPort_RS232  0x2000   // 8192
  37. #endif

  38. #if cTCP_ADAC == 0
  39. #define cTCP_ListenPort_ADAC   0x3000   // 12288
  40. #endif

  41. // 客户应用模式的本地TCP端口号。不能与知名端口相同!如:23, 80
  42. // 注意:对不同的TCP事件使用不同的本地端口号(包括:本地侦听端口),有助于快速查找TCP事件而
  43. //       不需要判断IP是否相同!这样做能使本地快速响应。
  44. #if (cTCP_ADAC == 1) && (TCP_ACTIVE_OPEN == 1)
  45. #define cTCP_ActivePort_ADAC  0x3001   // 12289
  46. #endif




  47. // 分配系统应用临时缓冲区(按 wrod 存储)
  48. UINT16 guwAppBuf[cAppSizeMax];

  49. //--------------------------------------------------------------------------------------

  50. main(){
  51. #if  TCP_ACTIVE_OPEN == 1
  52.         UINT16 temp[2];
  53. #endif


  54. // 1. Hardware initialize: SPCE061A
  55.         SP_IO_INIT();

  56. // 2. Open and Enable Hardware interrupt 2Hz and Clear WatchDog!
  57.         SP_OpenTime2();

  58. // 3. Hardware initialize: RTL8019AS
  59.         RTL8019AS_RESET();
  60.         RTL8019AS_INIT();

  61. // 4. vIP4 TCP/IP initialize
  62.         msip_Init();

  63. // 5. We listen test port
  64.         msip_Listen(cTCP_ListenPort_TEST);                // 用于侦听来自链路测试的TCP包


  65. #if cTCP_RS232 == 1
  66.         SP_UART_INIT(C_UART_Baud_115200);                // Hardware initialize: UART of SPCE061A

  67.         msip_Listen(cTCP_ListenPort_RS232);                // 用于侦听来自RS232的TCP包
  68. #endif


  69. #if cTCP_ADAC == 1
  70. //        SP_ADAC_INIT(cSample_4096);                                // Open ADAC
  71. //        SP_ADAC_INIT(cSample_8192);                                // Open ADAC
  72. //        SP_ADAC_INIT(cSample_16384);                        // Open ADAC
  73. //        SP_ADAC_INIT(cSample_32768);                        // Open ADAC
  74. //        SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC

  75.         msip_Listen(cTCP_ListenPort_ADAC);                // 用于侦听来自远端的Audio的TCP包
  76. #endif


  77. #if (cTCP_ADAC == 1) && (TCP_ACTIVE_OPEN == 1)
  78. // for test audio, wo active link remote: 192.168.0.60
  79.         temp[0] = ((192<<8)|168);
  80.         temp[1] = ((0<<8)|30);
  81.         msip_Connect(cTCP_ActivePort_ADAC, temp, cTCP_ListenPort_ADAC);
  82. #endif



  83. // 6. We do TCP/IP Check Loop
  84. loop:
  85.         // 接收新的以太包,并处理
  86.         if ((guwEthLen = ether_Receive()) != 0){
  87.                 switch (cptEthHdrBuf->EthType){
  88.                 case cEthType_Arp:
  89.                         msip_Arp_In();
  90.                         break;
  91.                 case cEthType_Ip:
  92.                         msip_Input();
  93.                 }
  94.         }

  95.         // ARP表老化处理
  96.         if (guwMsg_Route & cM_ARP_TIME){
  97.                 msip_Arp_Time();
  98.         }

  99.         // TCP事件轮询
  100.         if (guwMsg_Route & cM_TCP_PERIODIC){
  101.                 msip_Periodic();
  102.         }

  103.     goto loop;

  104. }



  105. // SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB-SUB


  106. //--------------------------------------------------------------------------------------
  107. //
  108. //      |--------------|       |-----|----------|------|       |------|--------|
  109. //      |工业设备|RS232| <---> |RS232|核心嵌入板|TCP/IP| <---> |TCP/IP|普通PC机|
  110. //      |--------------|       |-----|----------|------|       |------|--------|
  111. //
  112. //-------------------------------------------------------------------------------------
  113. void userapp(){

  114.         switch (gptConn->LocalPort){
  115. #if cTCP_RS232 == 1
  116.         case cTCP_ListenPort_RS232:
  117.                 goto link_rs232;
  118. #endif

  119. #if cTCP_ADAC == 1        // ADAC 工作时:由于双向通讯,所以Listen和Active处理是一样的!
  120.         case cTCP_ListenPort_ADAC:
  121.                 goto link_adac_listen;
  122. #endif

  123. #if (cTCP_ADAC == 1) && (TCP_ACTIVE_OPEN == 1)        // ADAC 工作时:由于双向通讯,所以Listen和Active处理是一样的!
  124.         case cTCP_ActivePort_ADAC:
  125.                 goto link_adac_active;
  126. #endif

  127.         case cTCP_ListenPort_TEST:
  128.                 goto test_net;

  129.         default:
  130.                 return;
  131.         }


  132. #if cTCP_RS232 == 1
  133. link_rs232:         // 与RS232透明传输通讯:本系统的一个应用。


  134. // 以下事件的过虑判断并不按照事件发生的顺序,是因为有些事件通常只会发生一次,
  135. // 从而在大多数其它经常发生的事件状态下,减少对那些事件的过滤判断,以提高速度!!!

  136.         if (msip_Poll() || msip_Acked()){        // 如果RS232有数据要发送,就转发TCP数据段!
  137.                 if (guwUartRxLen > 0) {        // 根据guwUartRxLen判断是否转发RS232数据
  138.                         MEMCPY(guwUartRxLen, guwUartRxBuf, cpTcpData);
  139.                         guwEthLen = guwUartRxLen;
  140.                         guwUartRxLen = 0;
  141.                         gptConn->PollTime = 0;        // 清除空闲时间记数
  142.                 } else        if (gptConn->PollTime++ > 3*cTCP_MAX_POLL){        // 太长时间空闲(900秒),终止连接!
  143.                                 msip_Close();
  144.                 }

  145.                 return;
  146.         }

  147.         if (msip_NewData()){        // 收到TCP数据包,转发给RS232
  148.                 if (guwEthLen > 0){
  149.                         SP_UART_TX(guwEthLen, cpTcpData);
  150.                         guwEthLen = 0;
  151.                 }
  152.                 if (guwUartRxLen > 0) {        // 根据guwUartRxLen判断是否转发RS232数据
  153.                         MEMCPY(guwUartRxLen, guwUartRxBuf, cpTcpData);
  154.                         guwEthLen = guwUartRxLen;
  155.                         guwUartRxLen = 0;
  156.                         gptConn->PollTime = 0;        // 清除空闲时间记数
  157.                 }

  158.                 gptConn->PollTime = 0;        // 清除空闲时间记数
  159.                 return;
  160.         }

  161.         if (msip_Connected()){
  162.                 gptConn->PollTime = 0;        // 清除空闲时间记数
  163.                 guwEthLen = 0;                        // 释放TCP数据区

  164.                 return;
  165.         }


  166. //        if (msip_Aborted() || msip_Closed()){        // 如果异常关闭,那就关闭当前连接
  167.                 // Nothing to do!
  168. //                return;
  169. //        }

  170.         return;
  171. #endif



  172. #if cTCP_ADAC == 1        // ADAC 工作时:由于双向通讯,所以Listen和Active处理是一样的!
  173. link_adac_listen:
  174.         if (msip_Acked()){   // 如果有A/D数据要发送,就转发TCP数据包
  175.                 /*
  176.                 if (guwMicRxLen > 0) {        // 根据guwMicRxLen判断是否转发Audio数据
  177.                         SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  178.                         MEMCPY(guwMicRxLen, guwMicRxBuf, cpTcpData);
  179.                         guwEthLen = guwMicRxLen;
  180.                         guwMicRxLen = 0;                // A/D 转换计数复位
  181.                         SP_OPEN_FIQ();                        // 开启FIQ中断,同时也开启了ADAC
  182.                         gptConn->PollTime = 0;        // 清除空闲时间记数
  183.                 } */
  184.                 guwEthLen = 0;
  185.                 return;
  186.         }


  187.         if (msip_NewData()){
  188.                 /*
  189.                 if (guwEthLen > 0){        // 收到Audio数据包
  190.                          // 如果上次没有转换完,就等....
  191.                         while(guwDAC1TxLen < guwDAC1TotalLen);
  192.                         // 如果转换完,就复制buffer
  193.                         SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  194.                         if (guwEthLen > cDAC1_MAXLEN){  // 拦截超长bytes部分
  195.                                 guwEthLen = cDAC1_MAXLEN;
  196.                         }
  197.                         MEMCPY(guwEthLen, cpTcpData, guwDAC1TxBuf); // 将TCP数据Audio复制给DAC1的buffer
  198.                         guwDAC1TxLen = 0;                           // DAC1 转换计数复位
  199.                         guwDAC1TotalLen = guwEthLen;        // DAC1 转换buffer总长
  200.                         SP_OPEN_FIQ();                                        // 开启FIQ中断,同时也开启了ADAC

  201.                         guwEthLen = 0;
  202.                 }
  203.                 if (guwMicRxLen > 0) {        // 根据guwMicRxLen判断是否转发Audio数据
  204.                         SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  205.                         MEMCPY(guwMicRxLen, guwMicRxBuf, cpTcpData);
  206.                         guwEthLen = guwMicRxLen;
  207.                         guwMicRxLen = 0;                // A/D 转换计数复位
  208.                         SP_OPEN_FIQ();                        // 开启FIQ中断,同时也开启了ADAC
  209.                 } */

  210.                 guwEthLen = 0;
  211.                 gptConn->PollTime = 0;        // 清除空闲时间记数
  212.                 return;

  213.         }


  214.         if (msip_Connected()){
  215.                 gptConn->PollTime = 0;        // 清除空闲时间记数
  216.                 guwEthLen = 0;                        // 释放TCP数据区
  217.                 /*
  218.                 guwMicRxLen = 0;                // A/D 转换计数复位
  219.                 guwDAC1TotalLen = 0;        // DAC1 转换计数复位
  220.                 SP_OPEN_FIQ();                        // 开启FIQ中断,同时也开启了ADAC
  221.                 */

  222.                 return;
  223.         }

  224.         if (msip_Poll()){
  225.                 if (gptConn->PollTime++ > 3*cTCP_MAX_POLL){        // 太长时间空闲(900秒),终止连接!
  226.                                 msip_Close();
  227.                                 //SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  228.                 }
  229.                 guwEthLen = 0;
  230.                 return;
  231.         }

  232.         if (msip_Aborted() || msip_Closed()){        // 如果异常关闭,那就关闭当前连接
  233.                 //SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  234.                 return;
  235.         }

  236. link_adac_active:
  237.         if (msip_Acked()){   // 如果有A/D数据要发送,就转发TCP数据包
  238.                 /*
  239.                 if (guwMicRxLen > 0) {        // 根据guwMicRxLen判断是否转发Audio数据
  240.                         SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  241.                         MEMCPY(guwMicRxLen, guwMicRxBuf, cpTcpData);
  242.                         guwEthLen = guwMicRxLen;
  243.                         guwMicRxLen = 0;                // A/D 转换计数复位
  244.                         SP_OPEN_FIQ();                        // 开启FIQ中断,同时也开启了ADAC
  245.                         gptConn->PollTime = 0;        // 清除空闲时间记数
  246.                 } */
  247.                 guwEthLen = 0;
  248.                 return;
  249.         }


  250.         if (msip_NewData()){
  251.                 /*
  252.                 if (guwEthLen > 0){        // 收到Audio数据包
  253.                          // 如果上次没有转换完,就等....
  254.                         while(guwDAC1TxLen < guwDAC1TotalLen);
  255.                         // 如果转换完,就复制buffer
  256.                         SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  257.                         if (guwEthLen > cDAC1_MAXLEN){  // 拦截超长bytes部分
  258.                                 guwEthLen = cDAC1_MAXLEN;
  259.                         }
  260.                         MEMCPY(guwEthLen, cpTcpData, guwDAC1TxBuf); // 将TCP数据Audio复制给DAC1的buffer
  261.                         guwDAC1TxLen = 0;                           // DAC1 转换计数复位
  262.                         guwDAC1TotalLen = guwEthLen;        // DAC1 转换buffer总长
  263.                         SP_OPEN_FIQ();                                        // 开启FIQ中断,同时也开启了ADAC

  264.                         guwEthLen = 0;
  265.                 }
  266.                 if (guwMicRxLen > 0) {        // 根据guwMicRxLen判断是否转发Audio数据
  267.                         SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  268.                         MEMCPY(guwMicRxLen, guwMicRxBuf, cpTcpData);
  269.                         guwEthLen = guwMicRxLen;
  270.                         guwMicRxLen = 0;                // A/D 转换计数复位
  271.                         SP_OPEN_FIQ();                        // 开启FIQ中断,同时也开启了ADAC
  272.                 } */

  273.                 guwEthLen = 0;
  274.                 gptConn->PollTime = 0;        // 清除空闲时间记数
  275.                 return;

  276.         }


  277.         if (msip_Connected()){
  278.                 gptConn->PollTime = 0;        // 清除空闲时间记数
  279.                 guwEthLen = 0;                        // 释放TCP数据区
  280.                 /*
  281.                 guwMicRxLen = 0;                // A/D 转换计数复位
  282.                 guwDAC1TotalLen = 0;        // DAC1 转换计数复位
  283.                 SP_OPEN_FIQ();                        // 开启FIQ中断,同时也开启了ADAC
  284.                 */

  285.                 return;
  286.         }

  287.         if (msip_Poll()){
  288.                 if (gptConn->PollTime++ > 3*cTCP_MAX_POLL){        // 太长时间空闲(900秒),终止连接!
  289.                                 msip_Close();
  290.                                 //SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  291.                 }
  292.                 guwEthLen = 1460;
  293.                 return;
  294.         }

  295.         if (msip_Aborted() || msip_Closed()){        // 如果异常关闭,那就关闭当前连接
  296.                 //SP_CLOSE_FIQ();                // 关闭FIQ中断,同时也禁止了ADAC
  297.                 return;
  298.         }


  299.         return;
  300. #endif





  301. // 以下部分用于Ping功能失效时的网络测试!TMD现在网络病毒太多,许多ISP运营商都禁Ping了!
  302. // 不管是否传数据,都将在300秒后断开.....
  303. test_net:

  304.         if (msip_NewData()){
  305.                 // Message: 收到!别惹我,烦着呢......
  306.                 cpTcpData[0] = 0xcad5;
  307.                 cpTcpData[1] = 0xb5bd;
  308.                 cpTcpData[2] = 0xa3a1;
  309.                 cpTcpData[3] = 0xb1f0;
  310.                 cpTcpData[4] = 0xc8c7;
  311.                 cpTcpData[5] = 0xced2;
  312.                 cpTcpData[6] = 0xb7b3;
  313.                 cpTcpData[7] = 0xb7b1;
  314.                 cpTcpData[8] = 0xd7c5;
  315.                 cpTcpData[9] = 0xc4d8;
  316.                 cpTcpData[10] = 0x2e2e;
  317.                 cpTcpData[11] = 0x2e2e;
  318.                 cpTcpData[12] = 0x2e2e;
  319.                 guwEthLen = 26;
  320.                 return;
  321.         }

  322.         if (msip_Poll()){
  323.                 if (gptConn->PollTime == 0){
  324.                         // Message: Welcome to you!
  325.                         cpTcpData[0] = 0x5765;        // "We"+
  326.                         cpTcpData[1] = 0x6c63;        // "lc"+
  327.                         cpTcpData[2] = 0x6f6d;        // "om"+
  328.                         cpTcpData[3] = 0x6520;        // "e "+
  329.                         cpTcpData[4] = 0x746f;        // "to"+
  330.                         cpTcpData[5] = 0x2079;        // "yo"+
  331.                         cpTcpData[6] = 0x6f75;        // " u"+
  332.                         cpTcpData[7] = 0x2120;        // "! "
  333.                         guwEthLen = 16;
  334.                 }

  335.                 if (gptConn->PollTime++ > cTCP_MAX_POLL){        // 太长时间空闲,终止连接!
  336.                         msip_Close();
  337.                 }

  338.                 return;
  339.         }


  340.         if (msip_Connected()){
  341.                 gptConn->PollTime = 0;        // 清除空闲时间记数
  342.                 return;
  343.         }

  344. //        if (msip_Aborted() || msip_Closed()){        // 如果异常关闭,那就关闭当前连接
  345.                 // Nothing to do!
  346. //                return;
  347. //        }

  348.         return;
  349. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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