/*设定等待数据的时长,设置如果长时间没收到服务器响应,则超时返回,不用阻塞*/ ret = setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&MAXTIMEOUT, sizeof(MAXTIMEOUT)); /*tftp协议的第一步:向服务器写文件请求*/ //1.构建写文件请求,准备向服务器上传文件,文件名为inputfilename,文件模式为mode /************Begin 1 ***********/ /***********End 1 *************/
时间: 2023-06-29 13:11:59 浏览: 105
这段代码是在设置套接字的接收超时时间后,构建 TFTP 协议中的写请求(WRQ),准备向服务器上传文件。其中 `setsockopt()` 函数设置了套接字的接收超时时间,如果在规定时间内没有收到服务器的响应,则会超时返回。接着,代码中使用 `WRQ_OP` 定义的操作码和指定的文件名和模式构建了一个写请求。具体的实现细节需要看函数内部的代码。
相关问题
ESP32-C3, esp-idf 4.3.5,如何设置tcp client 非阻塞式的超时时间
在 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 是否可读或可写。
如何设置send函数缓冲区超时发送
在 C 语言中,可以使用 `setsockopt()` 函数设置发送数据时的超时时间。具体实现步骤如下:
1. 创建一个 socket,例如:
```
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
```
2. 设置发送超时时间,例如:
```
struct timeval timeout = {3, 0}; // 超时时间为 3 秒
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (const char *)&timeout, sizeof(timeout));
```
这里使用了 `setsockopt()` 函数来设置 SO_SNDTIMEO 选项,它将会影响到 `send()` 函数的行为。
3. 使用 `send()` 函数发送数据,例如:
```
char *data = "hello world";
int ret = send(sockfd, data, strlen(data), 0);
if (ret == -1) {
printf("send failed: %s\n", strerror(errno));
} else {
printf("send success\n");
}
```
在这里,如果发送数据的时间超过了设置的超时时间,那么 `send()` 函数就会返回 -1,并且 errno 会被设置为 EAGAIN(表示超时)或者 EWOULDBLOCK(表示非阻塞 socket 被阻塞)。
需要注意的是,设置发送超时时间只对阻塞式 socket 有效,对非阻塞式 socket 无效。如果需要设置非阻塞式 socket 的超时时间,可以使用 `select()` 函数或者 epoll 等多路复用机制来实现。
阅读全文