|
最近在ucos里面移植了最新版的2.1.2的lwip。程序已经跑起来了,可以正常ping通,于是就写了个客户端和电脑上面的tcp服务端通信。
我用的是socket编程方式,程序很简单,就是:建立socket,连接服务器,连接成功后就死循环发送数据,每发送一次数据延时1秒钟。如果发送返回的是-1,就关闭socket,然后重新这套流程。
程序运行是很正常的,一切都是那么的流畅。如果关闭tcp软件,程序会显示发送出错,然后重新连接。
但是,世界总是不会这么美好。
如果我在发送开始后,拔掉板子的网线。这个时候死循环的发送竟然不会报错,返回值是正常的。这导致了程序判断出错,陷入了死循环。
下面是简单的app部分,不知道你们用lwip的时候是怎么处理这种通信中把网线的问题。
- while(1)
- {
- sock = socket(AF_INET, SOCK_STREAM, 0);
- if (sock < 0)
- {
- PRINTF("Socket error\n");
- OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_PERIODIC, &err);
- continue;
- }
- client_addr.sin_family = AF_INET;
- client_addr.sin_port = htons(DEST_PORT);
- client_addr.sin_addr.s_addr = ipaddr.addr;
- memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));
- rt = connect(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
- if(rt == -1)
- {
- PRINTF("Connect failed!\n");
- closesocket(sock);
- OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_PERIODIC, &err);
- continue;
- }
- PRINTF("Connect to server successful!\n");
- while (1)
- {
- rt = send(sock, send_buf, sizeof(send_buf), 0);
- //rt = write(sock, send_buf, sizeof(send_buf));
- if(rt < 0)
- {
- PRINTF("send failed\r\n");
- closesocket(sock);
- OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_PERIODIC, &err);
- break;
- }
- OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_PERIODIC, &err);
- }
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|