【发布时间】:2011-05-16 13:41:06
【问题描述】:
我正在尝试从阻塞套接字读取,但我想知道 read() 返回 -1,我认为这意味着当前没有要读取的数据 - 我希望它会阻塞,直到它可以读取的数量字节。
我还尝试确保套接字处于阻塞模式并使用以下方法设置高超时:
int setBlockingIO(int fd)
{
int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));
int nTimeout = 30000; // 30 seconds
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&nTimeout, sizeof(int));
}
但这并没有改变任何东西。
我的问题:
- 我该怎么办
read()将really block? - 是否有一些我可能遇到的陷阱? (我的程序有错误?)
我知道有关于这个主题的another question,但我找不到我的问题的答案。
更新
在不设置超时的情况下,read() 也立即(主观地)返回 -1
更新 2
errno 是 107 (ENOTCONN, Transport endpoint is not connected).
但同时客户端并没有关闭连接(由write()之后的很长的sleep()保证)
【问题讨论】:
-
man read并阅读errno以确定发生的错误,不一定按此顺序。
标签: c sockets io blocking nonblocking