乐鑫技术交流
直播中

戚歆敦

7年用户 942经验值
私信 关注
[问答]

TCP_server例程断开再次连接会失败怎么处理?

使用了TCP_server的例程,发现当电脑作为客户端去连接esp32(服务器端)断开连接之后再次连接时候连不上,发现:提示已经连接上esp32发出的热点,但是网络助手显示连接失败(监听串口失败),socket error code:-1。
网上搜了一下,说是服务器并没有去监听这个设备的信息,原因在于没有去等待监听,哪位大神指导一下该怎么改??
                                 

回帖(1)

h1654155275.5916

2024-6-28 16:41:25
以下是一些建议来解决这个问题:

1. 确保服务器端在连接断开后关闭并重新初始化socket。这可以通过调用`close()`函数来实现,然后再次调用`listen()`函数来重新监听。

```c
if (client_socket != -1) {
    close(client_socket);
    client_socket = -1;
}

// 重新监听
if (listen(server_socket, 5) < 0) {
    printf("Error: Failed to listen on the server socketn");
    return -1;
}
```

2. 在服务器端的循环中,使用`select()`或`poll()`函数来检查是否有新的连接请求。这可以帮助服务器在连接断开后立即响应新的连接请求。

```c
fd_set readfds;
struct timeval timeout;

FD_ZERO(&readfds);
FD_SET(server_socket, &readfds);

// 设置超时时间,例如5秒
timeout.tv_sec = 5;
timeout.tv_usec = 0;

int result = select(server_socket + 1, &readfds, NULL, NULL, &timeout);

if (result > 0) {
    if (FD_ISSET(server_socket, &readfds)) {
        // 有新的连接请求
        client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_len);
        if (client_socket < 0) {
            printf("Error: Failed to accept connectionn");
            return -1;
        }
    }
}
```

3. 确保服务器端在处理连接请求时正确地处理错误和异常情况。例如,如果`accept()`函数返回-1,您应该检查错误代码并采取相应的措施。

4. 在客户端断开连接后,确保客户端在尝试重新连接之前等待一段时间。这可以防止由于网络延迟或其他原因导致的连接失败。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分