ESP32-C3, esp-idf 4.3.5,如何设置tcp client 非阻塞式的超时时间
时间: 2024-01-01 13:10:37 浏览: 383
在 ESP32-C3 上使用 esp-idf 4.3.5 开发 TCP client,可以通过以下步骤设置非阻塞式的超时时间:
1. 创建一个 TCP socket,可以参考以下代码:
```
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sock < 0) {
ESP_LOGE(TAG, "Failed to create socket");
return;
}
```
2. 将 socket 设置为非阻塞模式,可以参考以下代码:
```
int flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
```
3. 设置超时时间,可以使用 setsockopt 函数,可以参考以下代码:
```
struct timeval timeout = {5, 0}; // 超时时间为5秒
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
```
4. 连接到服务器,可以使用 connect 函数,可以参考以下代码:
```
struct sockaddr_in server_addr;
server_addr.sin_addr.s_addr = inet_addr(server_ip);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
int ret = connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (ret < 0 && errno != EINPROGRESS) {
ESP_LOGE(TAG, "Failed to connect to server");
close(sock);
return;
}
```
在以上代码中,connect 函数可能会返回 EINPROGRESS 错误码,表示连接仍在进行中。如果连接成功,则 connect 函数会立即返回。如果连接超时,则会返回 ETIMEDOUT 错误码。
5. 发送数据和接收数据时,可以使用非阻塞式的方式,可以参考以下代码:
```
// 发送数据
int ret = send(sock, data, len, 0);
if (ret < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
ESP_LOGE(TAG, "Failed to send data");
close(sock);
return;
}
// 接收数据
char buffer[1024];
ret = recv(sock, buffer, sizeof(buffer), 0);
if (ret < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
ESP_LOGE(TAG, "Failed to receive data");
close(sock);
return;
}
```
在以上代码中,send 和 recv 函数可能会返回 EAGAIN 或者 EWOULDBLOCK 错误码,表示操作仍在进行中。如果超时,则会返回 ETIMEDOUT 错误码。
需要注意的是,在使用非阻塞式的方式进行网络通信时,需要处理 EAGAIN、EWOULDBLOCK 和 ETIMEDOUT 错误码。同时,还需要使用 select 或者 epoll 等函数,来检测网络 socket 是否可读或可写。
阅读全文