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上的谢谢了