| 第二十章 TCP Client20.1 TCP Client例程概述        TCP Client例程与TCP Server例程类似,本章节就主要应用函数进行讲解。        TCP Client例程是将W7500EVB配置成TCP客户端模式, 向指定的TCP服务器IP、端口发起连接。实现数据的接收与发送。20.2 TCP客户端流程 
 图20.2.1 TCP Client流程图20.3 TCP Client例程解析        例程的初始化部分和Network install例程相同,在此就不在赘述了。具体分析TCP Client的应用函数do_tcp_client()。 [mw_shl_code=applescript,true]1.     int32_t tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport,uint16_t local_port)2.     {
 3.       int32_t ret; // return value for SOCK_ERRORs
 4.       uint16_t size = 0, sentsize=0;
 5.       switch(getSn_SR(sn))                             /*获取socket的状态*/
 6.       {
 7.           case SOCK_ESTABLISHED :            /*socket处于连接建立状态*/
 8.             if(getSn_IR(sn) & Sn_IR_CON)
 9.             {
 10.            setSn_IR(sn, Sn_IR_CON);             /*清除接收中断标志位*/
 11.          }
 12.          if((size = getSn_RX_RSR(sn)) > 0)
 13.          {
 14.            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
 15.            ret = recv(sn, buf, size);                  /*接收来自Server的数据*/
 16.            if(ret <= 0) return ret;
 17.            sentsize = 0;
 18.            while(size != sentsize)
 19.            {
 20.              ret = send(sn, buf+sentsize, size-sentsize);/*向Server发送数据*/
 21.              printf("%s\r\n",buf);
 22.              if(ret < 0)
 23.              {
 24.                close(sn);
 25.                return ret;
 26.              }
 27.              sentsize += ret;
 28.            }
 29.          }
 30.          break;
 31.        case SOCK_CLOSE_WAIT :                    /*socket处于等待关闭状态*/
 32.          if((ret=disconnect(sn)) != SOCK_OK) return ret;
 33.          #ifdef _LOOPBACK_DEBUG_
 34.          printf("%d:Socket Closed\r\n", sn);
 35.          #endif
 36.          break;
 37.        case SOCK_INIT :                           /*socket处于初始化状态*/
 38.          #ifdef _LOOPBACK_DEBUG_
 39.          printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport);
 40.          #endif
 41.          if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret; /*socket连接服务器*/
 42.          break;
 43.        case SOCK_CLOSED:               /*socket处于关闭状态*/
 44.          close(sn);
 45.          if((ret=socket(sn, Sn_MR_TCP, local_port, 0x00)) != sn) return ret; // TCP socket open with 'any_port' port number
 46.          break;
 47.        default:
 48.          break;
 49.    }
 50.    return 1;
 51.  }[/mw_shl_code]
        5~49行跟TCP Server例程一样,也是switch判断套接字状态,45初始化socket为TCP Client模式后,41行向指定端口IP的TCP Server发起连接,12行成功建立连接后判断空闲接收缓存寄存器接收数据的长度,如果读取的数据长度大于0则表示接收到数据,程序会将接收的数据回发给数据发送方。        至此,TCP Server例程代码解析就结束了。将TCP Server例程编译烧录后打印串口信息结果如图20.3.1。 图20.3.1 TCP Client例程打印结果        使用网络调试助手,PC机以TCP服务器身份等待W7500EVB连接,测试是否能收发数据。结果如图20.3.2,连接成功,收发数据正常。W7500EVB设置为TCP客户端模式成功。 图20.3.2TCP Client例程数据交互 
 |