套接字接收(阻塞)失败并出现 errno EAGAIN - 资源暂时不可用
Socket recv (blocking) fails with errno EAGAIN - resource temporarily unavailable
我正在实现一个 UNIX 域套接字进程间通信代码,我随机遇到了这个错误 - "errno 11: Resource temporarily unavailable" 在尝试从套接字读取时。我使用MSG_PEEK从套接字中读取字节数,并为接收缓冲区分配字节,并读取实际数据。
套接字是一个阻塞套接字,我没有任何非阻塞代码(总而言之,accept/read/write)。关于什么可能导致阻塞套接字读取的任何指示?从 MSG_PEEK 的 man page 来看,当套接字被标记为非阻塞时,似乎可以返回 EAGAIN,使用 O_NONBLOCK.
失败发生在下面的 recv 调用上。
char temp_buffer[BUFFER_MAX];
num_bytes = recv(_connection_fd, &temp_buffer, BUFFER_SIZE_MAX, MSG_PEEK | MSG_TRUNC);
if (num_bytes < 0) {
LogError("Error reading from socket. %s", strerror(errno));
close(_connection_fd);
return -1;
}
.....
<Allocate memory>
.....
// Read actual data
num_bytes = read(_connection_fd, buffer, num_bytes);
...
<Send response back to client>
<Close socket descriptor>
如果套接字设置了超时SO_RCVTIMEO选项(默认为0),也可能发生阻塞套接字和阻塞接收。顺便说一句,你在 recv() 之前考虑过 select() 吗?
我正在实现一个 UNIX 域套接字进程间通信代码,我随机遇到了这个错误 - "errno 11: Resource temporarily unavailable" 在尝试从套接字读取时。我使用MSG_PEEK从套接字中读取字节数,并为接收缓冲区分配字节,并读取实际数据。
套接字是一个阻塞套接字,我没有任何非阻塞代码(总而言之,accept/read/write)。关于什么可能导致阻塞套接字读取的任何指示?从 MSG_PEEK 的 man page 来看,当套接字被标记为非阻塞时,似乎可以返回 EAGAIN,使用 O_NONBLOCK.
失败发生在下面的 recv 调用上。
char temp_buffer[BUFFER_MAX];
num_bytes = recv(_connection_fd, &temp_buffer, BUFFER_SIZE_MAX, MSG_PEEK | MSG_TRUNC);
if (num_bytes < 0) {
LogError("Error reading from socket. %s", strerror(errno));
close(_connection_fd);
return -1;
}
.....
<Allocate memory>
.....
// Read actual data
num_bytes = read(_connection_fd, buffer, num_bytes);
...
<Send response back to client>
<Close socket descriptor>
如果套接字设置了超时SO_RCVTIMEO选项(默认为0),也可能发生阻塞套接字和阻塞接收。顺便说一句,你在 recv() 之前考虑过 select() 吗?