硬件:STM32F407VCT6+LAN8720
软件: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<3;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套接字个数
TCP设置套接字个数 == N
当连续N次后的连接断开后,就会提示“Create socket error”;
不过等上几秒后,再N次连接断开,问题就重现,提示“Create socket error”
个人认为是内存没有释放完导致的,即使调用了closesocket
问题:怎么解决tcp客户端连续连接断开,而不会造成socket错误?