搜索
bottom↓
回复: 14

LWIP之tcp_write 发送4096字节问题

[复制链接]

出0入0汤圆

发表于 2013-10-19 13:07:14 | 显示全部楼层 |阅读模式
板子作为tcpserver,电脑作为tcpclient
现在的问题是一次发送数据长度为4096,但是MTU最大为1500,所以做了如下处理
//-----------------------------------------------------------------------------
// ETH发送
//-----------------------------------------------------------------------------
void Eth_Send(unsigned char *p,unsigned int len)
{
        while(len>1400)
        {
                tcp_write(tcp_server_pcb,p,1400,0);                // 将要发送的数据放入发送队列
                len -= 1400;
                p += 1400;
        }
        tcp_write(tcp_server_pcb,p,len,0);                // 将要发送的数据放入发送队列
        tcp_output(tcp_server_pcb);                                // 立即发送数据
        tcp_sent(tcp_server_pcb,tcp_sended);        // 数据发送完毕后本函数的回调函数会被调用
}
但是最多能发送2800字节以内
请高手指点

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入442汤圆

发表于 2013-10-19 13:37:04 | 显示全部楼层
你每次都发1400字节,你考虑到最后4200字节时的溢出没有?到那里程序就飞掉了。当然是每次最多发2800字节了。

出0入0汤圆

 楼主| 发表于 2013-10-20 12:07:12 | 显示全部楼层
本帖最后由 mdz2011 于 2013-10-20 12:12 编辑
wye11083 发表于 2013-10-19 13:37
你每次都发1400字节,你考虑到最后4200字节时的溢出没有?到那里程序就飞掉了。当然是每次最多发2800字节了 ...


多谢指点

出0入0汤圆

发表于 2013-11-19 00:30:23 | 显示全部楼层
wye11083 发表于 2013-10-19 13:37
你每次都发1400字节,你考虑到最后4200字节时的溢出没有?到那里程序就飞掉了。当然是每次最多发2800字节了 ...

请问这个问题怎么解决呢》

出0入0汤圆

发表于 2013-11-19 00:31:02 | 显示全部楼层
解决了没有啊?我遇到相同问题

出0入442汤圆

发表于 2013-11-19 00:34:56 | 显示全部楼层
1295756899 发表于 2013-11-19 00:30
请问这个问题怎么解决呢》

可以这么写:
void Eth_Send(unsigned char *p,unsigned int len)
{
        while(len>1400)
        {
                unsigned int wlen = len >= 1400 ? 1400 : len;
                tcp_write(tcp_server_pcb,p, wlen, 0);                // 将要发送的数据放入发送队列
                len -= wlen;
                p += wlen;
        }
        tcp_output(tcp_server_pcb);                                // 立即发送数据
        tcp_sent(tcp_server_pcb,tcp_sended);        // 数据发送完毕后本函数的回调函数会被调用
}
这样控制每个包的大小不越界,就不会出问题。

出0入0汤圆

发表于 2013-11-19 09:42:02 | 显示全部楼层
wye11083 发表于 2013-11-19 00:34
可以这么写:
void Eth_Send(unsigned char *p,unsigned int len)
{

请问你这个程序和一楼有区别吗,他的好像也是判读了每次数据包1400

出0入0汤圆

发表于 2013-11-19 09:45:23 | 显示全部楼层
wye11083 发表于 2013-11-19 00:34
可以这么写:
void Eth_Send(unsigned char *p,unsigned int len)
{

我现在遇到个问题
用的STM32+LWIP的方案,想要发送10k字节的数据,用的一个for循环每次调用tcp_write(serve_pcb,pp,1000,0);发送1000字节数据,问题是每个for循环下来只能发送1000字节。
  for(i=0;i<10;i++)
{ tcp_write(serve_pcb,pp,1000,0);
   tcp_output(serve_pcb);
}

看了网上的说明修改了#define TCP_SND_QUEUELEN   (3000 * TCP_SND_BUF)/TCP_MSS//连续tcp_write次数
但是没什么效果。

如果降低每次发送的字节数,最多一个for循环能发送1400字节。
请问大家又这方面的经验吗?

出0入0汤圆

发表于 2013-11-19 09:46:11 | 显示全部楼层
学一下 httpserver的做法

在sent里面做剩余部分的发送

出0入442汤圆

发表于 2013-11-19 10:14:59 | 显示全部楼层
1295756899 发表于 2013-11-19 09:42
请问你这个程序和一楼有区别吗,他的好像也是判读了每次数据包1400

我这当然有区别了,要不然我写它干吗?我每次先检查能发多少字节,然后就发这么多个字节。而LZ那是管它有多少,先发1400字节。

出100入101汤圆

发表于 2014-4-28 13:04:08 | 显示全部楼层
1295756899 发表于 2013-11-19 09:45
我现在遇到个问题
用的STM32+LWIP的方案,想要发送10k字节的数据,用的一个for循环每次调用tcp_write(ser ...

3000保留,把tcp_output去掉就应该对了。

出0入0汤圆

发表于 2014-4-29 11:03:10 | 显示全部楼层
fengyunyu 发表于 2014-4-28 13:04
3000保留,把tcp_output去掉就应该对了。

用tcp_write()这个函数是不是就不用分配数据包和将数据复制到数据包中去了

出0入0汤圆

发表于 2014-4-29 12:48:41 | 显示全部楼层
fengyunyu 发表于 2014-4-28 13:04
3000保留,把tcp_output去掉就应该对了。

我也碰到了相同的问题。按你的试了,但是没有效果

出0入0汤圆

发表于 2014-4-29 13:01:49 | 显示全部楼层
楼主,你的问题搞定了没?我也碰到了相同的问题

出0入0汤圆

发表于 2014-4-29 13:27:34 | 显示全部楼层
1295756899 发表于 2013-11-19 09:45
我现在遇到个问题
用的STM32+LWIP的方案,想要发送10k字节的数据,用的一个for循环每次调用tcp_write(ser ...

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

本版积分规则

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

GMT+8, 2024-7-23 11:22

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

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