欢迎进入PCB抄板科技有限公司网站
全国服务热线
020-66**9888
PCB抄板
怎么解决tcp客户端连续连接断开而不会造成socket错误?
时间: 2023-07-28 10:31 浏览次数:
怎么解决tcp客户端连续连接断开而不会造成socket错误?软件:LWIP(TCPClient)下面是使用到tcpclient的部分代码,作用是将传进线程的IP和发送信息发出后,等待1s接收就关闭线程static void
软件:LWIP(TCPClient)

下面是使用到tcpclient的部分代码,作用是将传进线程的IP和发送信息发出后,等待1s接收就关闭线程

static void set_tcp_net_thread(void *arg)

int sock = -1;
struct hostent host = RT_NULL;
struct sockaddr_in server_addr;
mytcpclient clnt_param =
.ip_port = client_param.ip_port, //send port
.ip_type = client_param.ip_type, //send port
.ip_addr = client_param.ip_addr,
.ip_data = client_param.ip_data,
.ip_datalen = client_param.ip_datalen,

//作用:局部定义变量不会报错
rt_uint8_t i = 0;
for(i=0;i i++) // 轮询检查待发送数据需使用的IP和端口号是否已经创建过接收信息的线程;作用:避免出现相同IP和端口号再socket导致数据接收有问题

if((strcmp(tcpclient_send_msg[i].ip,clnt_param.ip_addr)==0) tcpclient_send_msg[i].port == clnt_param.ip_port)

send(tcpclient_send_msg[i].sock, clnt_param.ip_data, clnt_param.ip_datalen, 0);
return ;



/ 通过函数入口参数url获得host地址(如果是域名,会做域名解析) /
host = gethostbyname(clnt_param.ip_addr);
if (host == RT_NULL)

LOG_D("Get host by name failed!\n");
return ;

/ 创建一个socket,类型是SOCKET_STREAM,TCP类型 /
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)

/ 创建socket失败 /
LOG_D("Create socket error\n");
goto __exit;

/ 初始化预连接的服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(clnt_param.ip_port);
server_addr.sin_addr = *((struct in_addr )host- h_addr);
rt_memset( (server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
/ 连接到服务端 */
if (connect(sock, (struct sockaddr ) server_addr, sizeof(struct sockaddr)) == -1)

/ 连接失败 /
LOG_D("Connect fail!\n");
goto __exit;

/ 发送数据到sock连接 */
send(sock, clnt_param.ip_data, clnt_param.ip_datalen, 0);
//作用:局部定义变量不会报错
char recv_data[8] = 0
rt_uint8_t data_len = 0;
recv(sock, recv_data, data_len - 1, 0);
// LOG_D("recv data :%s\r\n",recv_data);

__exit:
if (sock = 0)

LOG_D("colse socket:%d",sock);
closesocket(sock);
// sock = -1; //没有用,每次打开线程会重新赋值

return ;

下图是设置的TCP套接字个数

1.jpg

TCP设置套接字个数 == N
当连续N次后的连接断开后,就会提示“Create socket error”;
不过等上几秒后,再N次连接断开,问题就重现,提示“Create socket error”

个人认为是内存没有释放完导致的,即使调用了closesocket

问题:怎么解决tcp客户端连续连接断开,而不会造成socket错误?

Copyright © PCB抄板科技有限公司 版权所有 粤ICP备2023073323号
全国服务电话:020-66**9888   传真:020-66**9888
公司地址:广东省广州市番禺经济开发区58号