搜索
bottom↓
回复: 7

tcp_write之后,调用tcp_output会立即发送吗?

[复制链接]

出0入22汤圆

发表于 2019-5-13 12:17:53 | 显示全部楼层 |阅读模式
如题,使用的是stm32cube生成的lwip,现在tcp想往外面发送大量的数据,查资料说,相继调用这两个函数,即可用将数据发送出去。
但是现在的现象是,我设置的缓冲区是4096byte,发送内容10多k,而收方只收到1.7k多。
发送方,最终会因为tcp_sndbuf(tpcb);返回0,累计超时退出。
代码如下:
  1. do
  2.         {
  3.                 int ret=0;
  4.                 buf_len=tcp_sndbuf(tpcb);
  5.                 //if(buf_len>600)buf_len=600;
  6.                 if(buf_len==0)
  7.                 {
  8.                         errCnt++;
  9.                 }
  10.                 else
  11.                 {
  12.                         errCnt=0;
  13.                 }
  14.                 if(errCnt>10000)
  15.                 {
  16.                         printf("no enough buffer to write, exit...\r\n");
  17.                         break;
  18.                 }
  19.                 if(file_len<=buf_len)
  20.                 {
  21.                         ret=tcp_write(tpcb,file_data,file_len,1);
  22.                         if(ERR_OK!=ret)
  23.                         {
  24.                                 printf("tcp write error code=%d...\r\n",ret);
  25.                         }
  26.                         //printf("%.*s", file_len, &file_data[l]);
  27.                         l+=file_len;
  28.                 }
  29.                 else
  30.                 {
  31.                         if(buf_len>(file_len-l))
  32.                         {
  33.                                 //printf("%.*s", file_len-l, &file_data[l]);
  34.                                 ret=tcp_write(tpcb,&file_data[l],file_len-l,1);
  35.                                 if(ERR_OK!=ret)               
  36.                                 {
  37.                                         printf("tcp write error code=%d...\r\n",ret);
  38.                                 }
  39.                                 l+=file_len;       
  40.                         }
  41.                         else                                                       
  42.                         {
  43.                                 //printf("%.*s", tcp_sndbuf(tpcb), &file_data[l]);
  44.                                 ret=tcp_write(tpcb,&file_data[l],buf_len,1);
  45.                                 if(ERR_OK!=ret)
  46.                                 {
  47.                                         printf("tcp write error code=%d...\r\n",ret);
  48.                                 }
  49.                                 l+=buf_len;                                       
  50.                         }                                                                                                                       
  51.                 }
  52.                 if(tcp_output(tpcb)!=ERR_OK)
  53.                 {
  54.                         printf("tcp_output error...\r\n");
  55.                 }       
  56.                 else
  57.                 {
  58.                         //extern struct netif gnetif;
  59.                         MX_LWIP_Process();//如果加了这句话,才能完整发送所有内容
  60.                 }
  61.                 if(ret==-11)
  62.                 {
  63.                         return;
  64.                 }
  65.                
  66.         }while(l<file_len);
复制代码


就算是这个代码以后,加上如下代码,接收方都无法收到1.7k以后的数据

  1. while(1)
  2.         {
  3.                 tcp_output(tpcb);
  4.         }
复制代码


是不是我哪里的配置没搞好?
官方配置,只将发送缓冲区修改成了4096,
mem_size 是 9216

请大家指导一下,谢谢!

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

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

出0入0汤圆

发表于 2019-5-13 12:20:52 | 显示全部楼层
tcp_write之后并不是立即送发送出去,是定时发送的,你可以去看poll里面,
所以你的数据量大了,要tcp_write之后还要调用发送函数发送出去,具体是哪个函数忘了,之前使用的时候发现了这个情况的

出0入0汤圆

发表于 2019-5-13 14:04:25 | 显示全部楼层
struct tcp_pcb  PCB控制块的标志flags设置上TF_NODELAY

出0入0汤圆

发表于 2019-5-13 14:17:59 | 显示全部楼层
一般tcp_write之后,数据只会发送到底层缓冲区,并不代表物理层已经把数据发送出去了,所以,数据量大,你可以试试分包发送,每包数据都预留一点时间间隔

出0入22汤圆

 楼主| 发表于 2019-5-14 08:46:20 | 显示全部楼层
kingaaa 发表于 2019-5-13 14:04
struct tcp_pcb  PCB控制块的标志flags设置上TF_NODELAY

谢谢回复,楼主位的帖子已经将该位置位了的。

出0入0汤圆

发表于 2019-5-14 11:07:44 | 显示全部楼层
zxq6 发表于 2019-5-14 08:46
谢谢回复,楼主位的帖子已经将该位置位了的。

选项设置了还有问题? 这个设置上以后都是立刻发送的,粘包的情况都不会有,不过我没用过cube生成测试过。对端接收没问题吗?不会把窗口关闭了吧

出0入22汤圆

 楼主| 发表于 2019-5-14 12:52:29 | 显示全部楼层
kingaaa 发表于 2019-5-14 11:07
选项设置了还有问题? 这个设置上以后都是立刻发送的,粘包的情况都不会有,不过我没用过cube生成测试过 ...

接收窗口没有关闭哈。
我从网上查到的资料也是这样说的,只是试验没成功。
谢谢您的指导,我再试试看。

出0入0汤圆

发表于 2019-5-14 15:10:08 | 显示全部楼层
本帖最后由 ly830102624 于 2019-5-14 15:12 编辑

我也在调试LWIP,1S 8K数据,分包发送,每包1K,间隔延时1ms。目前测试正常。
建议换个server端测试一下。我最初调试,发送多报数据后,数据就不发成功,一直道缓冲区溢出报错:ERR_MEM。
换了个server端,现在测试正常。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-22 03:29

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

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