第二十章 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例程数据交互
|