mdz2011 发表于 2013-10-19 13:07:14

LWIP之tcp_write 发送4096字节问题

板子作为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字节以内
请高手指点

wye11083 发表于 2013-10-19 13:37:04

你每次都发1400字节,你考虑到最后4200字节时的溢出没有?到那里程序就飞掉了。当然是每次最多发2800字节了。

mdz2011 发表于 2013-10-20 12:07:12

本帖最后由 mdz2011 于 2013-10-20 12:12 编辑

wye11083 发表于 2013-10-19 13:37 static/image/common/back.gif
你每次都发1400字节,你考虑到最后4200字节时的溢出没有?到那里程序就飞掉了。当然是每次最多发2800字节了 ...

多谢指点

1295756899 发表于 2013-11-19 00:30:23

wye11083 发表于 2013-10-19 13:37 static/image/common/back.gif
你每次都发1400字节,你考虑到最后4200字节时的溢出没有?到那里程序就飞掉了。当然是每次最多发2800字节了 ...

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

1295756899 发表于 2013-11-19 00:31:02

解决了没有啊?我遇到相同问题

wye11083 发表于 2013-11-19 00:34:56

1295756899 发表于 2013-11-19 00:30 static/image/common/back.gif
请问这个问题怎么解决呢》

可以这么写:
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);      // 数据发送完毕后本函数的回调函数会被调用
}
这样控制每个包的大小不越界,就不会出问题。

1295756899 发表于 2013-11-19 09:42:02

wye11083 发表于 2013-11-19 00:34 static/image/common/back.gif
可以这么写:
void Eth_Send(unsigned char *p,unsigned int len)
{


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

1295756899 发表于 2013-11-19 09:45:23

wye11083 发表于 2013-11-19 00:34 static/image/common/back.gif
可以这么写:
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字节。
请问大家又这方面的经验吗?

kayatsl 发表于 2013-11-19 09:46:11

学一下 httpserver的做法

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

wye11083 发表于 2013-11-19 10:14:59

1295756899 发表于 2013-11-19 09:42 static/image/common/back.gif
请问你这个程序和一楼有区别吗,他的好像也是判读了每次数据包1400

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

fengyunyu 发表于 2014-4-28 13:04:08

1295756899 发表于 2013-11-19 09:45
我现在遇到个问题
用的STM32+LWIP的方案,想要发送10k字节的数据,用的一个for循环每次调用tcp_write(ser ...

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

chengqun 发表于 2014-4-29 11:03:10

fengyunyu 发表于 2014-4-28 13:04
3000保留,把tcp_output去掉就应该对了。

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

chengqun 发表于 2014-4-29 12:48:41

fengyunyu 发表于 2014-4-28 13:04
3000保留,把tcp_output去掉就应该对了。

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

chengqun 发表于 2014-4-29 13:01:49

楼主,你的问题搞定了没?我也碰到了相同的问题

jzkn 发表于 2014-4-29 13:27:34

1295756899 发表于 2013-11-19 09:45
我现在遇到个问题
用的STM32+LWIP的方案,想要发送10k字节的数据,用的一个for循环每次调用tcp_write(ser ...

你发完了pp没有增加相应的位置变化吧?
比如pp+=1000?
纯粹猜想。。。
页: [1]
查看完整版本: LWIP之tcp_write 发送4096字节问题