初级会员
- 积分
- 148
- 金钱
- 148
- 注册时间
- 2016-10-17
- 在线时间
- 47 小时
|
最近调试一个以太网通讯,关于tcp_client接收问题,以下面的函数做为一个接收的进程,通过DHCP获取IP,可以正常通讯,但是有时连通之后,只接收了一条服务器回复,就无法再接收,服务器端收到我的心跳包并且回复了,通过反复复位测试,如果前两条收发正常,后面会一直正常,否则就一直不正常,概率50%,哪位遇到过能提提意见
void tcp_client_receive_thread(void *arg)
{
err_t err,err_r;
uint32_t data_len = 0;
struct pbuf *q;
struct netbuf *recvbuf;
static ip_addr_t server_ipaddr,loca_ipaddr;
static uint16_t loca_port;
LWIP_UNUSED_ARG(arg);
IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
while(1)
{
tcp_clientconn = netconn_new(NETCONN_TCP); //创建一个TCP链接
err = netconn_connect(tcp_clientconn,&server_ipaddr,global_server_port); //连接服务器
if(err != ERR_OK)
{
netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
}
else if (err == ERR_OK) //处理新连接的数据
{
netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
while(1)
{
err_r = netconn_recv(tcp_clientconn,&recvbuf);
if(err_r == ERR_OK) //接收到数据
{
portENTER_CRITICAL(); //关中断
memset(tcp_client_rxbuf,0,TCP_CLIENT_RX_BUFSIZE); //数据接收缓冲区清零
for(q=recvbuf->p;q!=NULL;q=q->next) //遍历完整个pbuf链表
{
if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len))
memcpy(tcp_client_rxbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
else
memcpy(tcp_client_rxbuf+data_len,q->payload,q->len);
data_len += q->len;
if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出
}
portEXIT_CRITICAL(); //开中断
tcp_client_receive.size = data_len;
data_len = 0;
netbuf_delete(recvbuf);
}
else if(err_r == ERR_CLSD) //关闭连接
{
tcp_client_flag &= ~LWIP_SEND_DATA;
netconn_close(tcp_clientconn);
netconn_delete(tcp_clientconn);
break;
}
}
}
osDelay(5);
}
}
void tcp_client_receive_init(void)
{
sys_thread_new("tcp_client_receive_thread", tcp_client_receive_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); //DEFAULT_THREAD_PRIO
}
|
|