我正在实现一个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>
1 回答
如果套接字具有超时SO_RCVTIMEO选项设置(默认为0),它也可能发生阻塞套接字和阻塞recv . 顺便说一下,你在recv()之前考虑过select()吗?