搜索
bottom↓
回复: 3

lwip的客户端1秒钟给服务器发送1次数据时候突然拔掉网线的问题

[复制链接]

出0入90汤圆

发表于 2020-4-27 15:52:19 | 显示全部楼层 |阅读模式
最近在ucos里面移植了最新版的2.1.2的lwip。程序已经跑起来了,可以正常ping通,于是就写了个客户端和电脑上面的tcp服务端通信。
我用的是socket编程方式,程序很简单,就是:建立socket,连接服务器,连接成功后就死循环发送数据,每发送一次数据延时1秒钟。如果发送返回的是-1,就关闭socket,然后重新这套流程。
程序运行是很正常的,一切都是那么的流畅。如果关闭tcp软件,程序会显示发送出错,然后重新连接。

但是,世界总是不会这么美好。
如果我在发送开始后,拔掉板子的网线。这个时候死循环的发送竟然不会报错,返回值是正常的。这导致了程序判断出错,陷入了死循环。

下面是简单的app部分,不知道你们用lwip的时候是怎么处理这种通信中把网线的问题。
  1. while(1)
  2.     {
  3.         sock = socket(AF_INET, SOCK_STREAM, 0);
  4.         if (sock < 0)
  5.         {
  6.             PRINTF("Socket error\n");
  7.             OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_PERIODIC, &err);
  8.             continue;
  9.         }

  10.         client_addr.sin_family = AF_INET;
  11.         client_addr.sin_port = htons(DEST_PORT);
  12.         client_addr.sin_addr.s_addr = ipaddr.addr;
  13.         memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));

  14.         rt = connect(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
  15.         if(rt == -1)
  16.         {
  17.             PRINTF("Connect failed!\n");
  18.             closesocket(sock);
  19.             OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_PERIODIC, &err);
  20.             continue;
  21.         }

  22.         PRINTF("Connect to server successful!\n");

  23.         while (1)
  24.         {
  25.             rt = send(sock, send_buf, sizeof(send_buf), 0);
  26.             //rt = write(sock, send_buf, sizeof(send_buf));
  27.             if(rt < 0)
  28.             {
  29.                 PRINTF("send failed\r\n");
  30.                 closesocket(sock);
  31.                 OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_PERIODIC, &err);
  32.                 break;
  33.             }

  34.             OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_PERIODIC, &err);
  35.         }
  36.     }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入442汤圆

发表于 2020-4-27 16:19:26 来自手机 | 显示全部楼层
唉,掉线不检测状态的吗?驱动底层要处理好。掉线强制结束所有socket。然后就是等rst或超时。估计你少了一些函数。让我想起来前年一同事编译我的代码到android上,折腾了半天,把报错全部修好,然后跑来告诉我不能用。我查了半天,nm他把报错的东西自己写了个替换上去,然后就没有然后了。

出0入4汤圆

发表于 2020-12-11 20:38:57 | 显示全部楼层
这个问题解决了吗? 楼主!

出0入90汤圆

 楼主| 发表于 2020-12-11 23:00:04 | 显示全部楼层
kyq_linux 发表于 2020-12-11 20:38
这个问题解决了吗? 楼主!

问题解决了,我换成freertos + lwip了,然后问题就解决了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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