我想从阻塞套接字读取,但我想知道read()
返回-1,我认为这意味着目前没有数据要读取 - 我希望它阻塞,直到它可以读取字节量。套接字:为什么使用ENOTCONN阻塞read()会失败?
我也试图确保插座处于阻塞模式,并且已高超时使用SET:
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,但在那里我找不到我的问题的答案。
UPDATE
没有设置超时,read()
也返回(subjectivly)立即-1
UPDATE 2
errno
是107(ENOTCONN, Transport endpoint is not connected)
。 但客户端侧具有不同时关闭连接(在write()
之后由长sleep()
确保)
'man read'并读取'errno'来确定发生的错误,但不一定按顺序。 – 2011-05-16 13:44:03