我正在实现UNIX域套接字Inter Process通信代码,我随机地发现了这个错误 - "错误11:资源暂时不可用"在尝试从套接字读取时。我使用MSG_PEEK读取套接字中的字节数,并为接收缓冲区分配字节,并读取实际数据。
套接字是一个阻塞套接字,我没有任何代码可以进行非阻塞(总之,接受/读/写)。什么可能导致阻塞套接字读取的指针?从MSG_PEEK的man page开始,当使用O_NONBLOCK将套接字标记为非阻塞时,似乎可以返回EAGAIN。
失败发生在下面的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>
答案 0 :(得分:1)
如果套接字已设置超时SO_RCVTIMEO选项(默认为0),则可能还会阻塞套接字并阻塞recv。顺便说一下,你在recv()之前考虑过select()吗?