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

2019-12-11 18:21发布

如题,使用的是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... ");
  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... ",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... ",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... ",ret);
  48.                                 }
  49.                                 l+=buf_len;                                       
  50.                         }                                                                                                                       
  51.                 }
  52.                 if(tcp_output(tpcb)!=ERR_OK)
  53.                 {
  54.                         printf("tcp_output error... ");
  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

请大家指导一下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
bailangcn
1楼-- · 2019-12-12 00:01
tcp_write之后并不是立即送发送出去,是定时发送的,你可以去看poll里面,
所以你的数据量大了,要tcp_write之后还要调用发送函数发送出去,具体是哪个函数忘了,之前使用的时候发现了这个情况的
kingaaa
2楼-- · 2019-12-12 02:25
struct tcp_pcb  PCB控制块的标志flags设置上TF_NODELAY
广轻电气091
3楼-- · 2019-12-12 06:50
一般tcp_write之后,数据只会发送到底层缓冲区,并不代表物理层已经把数据发送出去了,所以,数据量大,你可以试试分包发送,每包数据都预留一点时间间隔
zxq6
4楼-- · 2019-12-12 08:38
kingaaa 发表于 2019-5-13 14:04
struct tcp_pcb  PCB控制块的标志flags设置上TF_NODELAY

谢谢回复,楼主位的帖子已经将该位置位了的。
kingaaa
5楼-- · 2019-12-12 10:25
 精彩回答 2  元偷偷看……
zxq6
6楼-- · 2019-12-12 14:33
kingaaa 发表于 2019-5-14 11:07
选项设置了还有问题? 这个设置上以后都是立刻发送的,粘包的情况都不会有,不过我没用过cube生成测试过 ...

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

一周热门 更多>