TI中文支持网
TI专业的中文技术问题搜集分享网站

lwip协议中的连续多次调用tcp_write后失败

TI的大神们,帮忙看看,我的C6748板子上程序是这样的

void echo_init(void)
{
struct tcp_pcb *pcb;

pcb = tcp_new();
tcp_bind(pcb, IP_ADDR_ANY, ECHO_SERVER_PORT);
pcb = tcp_listen(pcb);
/* initialize callback arg and accept callback */
tcp_arg(pcb, pcb);
//只有客户端连接以后,才会执行echo_accept
tcp_accept(pcb, echo_accept);

}

当与PC上的客户端建立连接后 echo_accept()会被调用

err_t echo_accept(void *arg, struct tcp_pcb *pcb, err_t err)
{
// UARTPuts("echo_accept()…………………………………\r\n", -1);
char i=0;
LWIP_UNUSED_ARG(err);

/* Decrease the listen backlog counter */
tcp_accepted((struct tcp_pcb_listen*)arg);

tcp_setprio(pcb, ECHO_TCP_PRIO);
/* Set up the various callback functions */
// tcp_recv(pcb, echo_recv);//在这里不发生数据,而是在 tcp_sent(pcb, send); 中的send把数据发送出去,在这里将接收到的数据保存
tcp_err(pcb, NULL);
// tcp_poll(pcb, NULL, ECHO_POLL_INTERVAL);

// 仿照echo_send_data()写一个发送函数
// err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len))
//客户端连接以后,并没有执行sent函数
tcp_sent(pcb, NULL);

//实现一个发送函数,看对方是否能够接受
for( i=0;i<4;i++)
{tcp_write(pcb, mydata, MAX_SIZE , TCP_WRITE_FLAG_COPY);
tcp_output(pcb);}

return ERR_OK;
}

可是在客户端显示只接收到一次tcp_write()发送的数据,是 mydata[MAX_SIZE],  即4K大小,这是为什么呢

在VC中编写的client程序,用于接收的部分程序如下

while (1) { num = recv(ConnectSocket, temp, DEFAULT_BUFLEN, 0); if(num == 0) break; fwrite(temp, 1, num, fp);

}

按照网上的帖子http://blog.csdn.net/bobbat/article/details/42121507试了,还是不行啊

Denny%20Yang99373:

会不会因为发送速度太快TCP阻塞住了?

建议发一个包过去,对方回一个响应包,然后再发下一个。

这样进行流量控制会稳妥点

yanlong zhang1:

回复 Denny%20Yang99373:

TCP阻塞住了,是板子的TCP阻塞了吗,我把lwip的调试功能打开,发现tcp_write()调用不成功

tcp_write(pcb=c0808300, data=c0863f38, len=4096, apiflags=1)

tcp_enqueue(pcb=c0808300, arg=c0863f38, len=4096, flags=0, apiflags=1)

tcp_enqueue: too much data (len=4096 > snd_buf=4095)

发现是snd_buf设置过小

#define TCP_MSS 4096 /* default is 128 */#define TCP_SND_BUF (4* TCP_MSS)

我就更改TCP_SND_BUF 大小 发现如果TCP_SND_BUF = (4* TCP_MSS) tcp_write()前3次调用就会成功,但是第4到后面更多次后tcp_write()就会出现上面的错误,但是如果我要很长一段时间去发送数据,TCP_SND_BUF又不能设置为无限大,因为snd_buf是 short型的,TCP_SND_BUF又决定了snd_buf的大小,

发一个包过去,对方怎样回一个响应包呢?     在PC端的client程序中调用send(); 函数吗

我把程序给你发过去,能不能帮我看看,谢谢了,是运行在C6748上的谢谢了

赞(0)
未经允许不得转载:TI中文支持网 » lwip协议中的连续多次调用tcp_write后失败
分享到: 更多 (0)