如题,使用的是stm32cube生成的lwip,现在tcp想往外面发送大量的数据,查资料说,相继调用这两个函数,即可用将数据发送出去。
但是现在的现象是,我设置的缓冲区是4096byte,发送内容10多k,而收方只收到1.7k多。
发送方,最终会因为tcp_sndbuf(tpcb);返回0,累计超时退出。
代码如下:
- do
- {
- int ret=0;
- buf_len=tcp_sndbuf(tpcb);
- //if(buf_len>600)buf_len=600;
- if(buf_len==0)
- {
- errCnt++;
- }
- else
- {
- errCnt=0;
- }
- if(errCnt>10000)
- {
- printf("no enough buffer to write, exit...
");
- break;
- }
- if(file_len<=buf_len)
- {
- ret=tcp_write(tpcb,file_data,file_len,1);
- if(ERR_OK!=ret)
- {
- printf("tcp write error code=%d...
",ret);
- }
- //printf("%.*s", file_len, &file_data[l]);
- l+=file_len;
- }
- else
- {
- if(buf_len>(file_len-l))
- {
- //printf("%.*s", file_len-l, &file_data[l]);
- ret=tcp_write(tpcb,&file_data[l],file_len-l,1);
- if(ERR_OK!=ret)
- {
- printf("tcp write error code=%d...
",ret);
- }
- l+=file_len;
- }
- else
- {
- //printf("%.*s", tcp_sndbuf(tpcb), &file_data[l]);
- ret=tcp_write(tpcb,&file_data[l],buf_len,1);
- if(ERR_OK!=ret)
- {
- printf("tcp write error code=%d...
",ret);
- }
- l+=buf_len;
- }
- }
- if(tcp_output(tpcb)!=ERR_OK)
- {
- printf("tcp_output error...
");
- }
- else
- {
- //extern struct netif gnetif;
- MX_LWIP_Process();//如果加了这句话,才能完整发送所有内容
- }
- if(ret==-11)
- {
- return;
- }
-
- }while(l<file_len);
复制代码
就算是这个代码以后,加上如下代码,接收方都无法收到1.7k以后的数据
- while(1)
- {
- tcp_output(tpcb);
- }
复制代码
是不是我哪里的配置没搞好?
官方配置,只将发送缓冲区修改成了4096,
mem_size 是 9216
请大家指导一下,谢谢!
所以你的数据量大了,要tcp_write之后还要调用发送函数发送出去,具体是哪个函数忘了,之前使用的时候发现了这个情况的
谢谢回复,楼主位的帖子已经将该位置位了的。
接收窗口没有关闭哈。
我从网上查到的资料也是这样说的,只是试验没成功。
谢谢您的指导,我再试试看。
一周热门 更多>