第二十章 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()。 - 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. }
复制代码
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例程数据交互
|