初级会员
- 积分
- 180
- 金钱
- 180
- 注册时间
- 2019-9-13
- 在线时间
- 58 小时
|
1金钱
求助。。平台:F429,连接TCPserver后挂着过一段时间就接收不到数据了,如果把服务器关掉重新开就再也接不上了,变成ERR_CONN。然后就卡死在这个while里了
下面附代码:
while (1)
{
log_i("tcp server connecting :%d......", server_port );
tcp_clientconn = netconn_new(NETCONN_TCP); //创建一个TCP链接
err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器
if(err != ERR_OK) netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
else if (err == ERR_OK) //处理新连接的数据
{
struct netbuf *recvbuf;
tcp_clientconn->recv_timeout = 1000;//防止阻塞实时检测连接-(时间太短导致大包接收出错?)
netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
log_i("TCP Server %s:%d connected sucess.", server_ipaddr, server_port );
xTaskNotify( LedTaskHandle, 200, eSetValueWithOverwrite );/* 服务器连接状态,LED闪烁为300mS一次. */
while(1)
{
if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
{
err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf),NETCONN_COPY); //发送tcp_server_sentbuf中的数据
if(err != ERR_OK)
{
log_i("发送失败\r\n");
}
tcp_client_flag &= ~LWIP_SEND_DATA;
}
if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK) //接收到数据
{
taskENTER_CRITICAL(); //关中断
memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE); //数据接收缓冲区清零
for(q=recvbuf->p;q!=NULL;q=q->next) //遍历完整个pbuf链表
{
//判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
//的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
data_len += q->len;
if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出
}
taskEXIT_CRITICAL(); //开中断
data_len=0; //复制完成后data_len要清零。
log_i("TCP recdata sucess:");
printf("%s\r\n",tcp_client_recvbuf);
tcp_client_sendbuf = tcp_client_recvbuf;
tcp_client_flag |= LWIP_SEND_DATA;
netbuf_delete(recvbuf);
}else if(recv_err == ERR_CLSD) //关闭连接
{
netconn_close(tcp_clientconn);
netconn_delete(tcp_clientconn);
xTaskNotify( LedTaskHandle, 1000, eSetValueWithOverwrite );/* 服务器连接状态,LED闪烁为300mS一次. */
log_i("err:Can not link Server.");
break;
}
else if(recv_err != ERR_TIMEOUT)
{
log_i("%d\r\n",recv_err);//断掉服务器后总是出现ERR_CONN再也连接不上了
vTaskDelay(1000);
}
}
}
|
-
|