nonblocking recv returns 0 时如何知道是哪种情况?
How to know which case happens when nonblocking recv returns 0?
我有一个使用非阻塞套接字运行的简单 TCP 服务器。
引用自 recv 联机帮助页;
When a stream socket peer has performed an orderly shutdown, the return value will be 0 (the traditional "end-of-file" return).
The value 0 may also be returned if the requested number of bytes to receive from a stream socket was 0.
当套接字可读时,我用这段代码读取它:
uint8_t buf[2048];
ssize_t rlen;
while(1){
rlen = recv(fd, buf, sizeof(buf), 0);
if(rlen < 0){
/* some error came, let's close socket... */
}
else if(rlen == 0){
/* is there no bytes to read? do we need break; in here? */
/* is socket closed by peer? do we need to close socket? */
}
/* some code that process buf and rlen... */
}
我们如何知道当 recv
returns 0 时发生了哪种情况?
当 recv
returns 0 时,表示套接字已被其他对等点正常关闭,您也可以关闭它。当套接字中没有数据时,返回 -1 并且 errno
设置为 EAGAIN
/ ETIMEDOUT
并且套接字没有被关闭。
最后,当返回 -1 并且 errno
设置为不同于 EWOULDBLOCK
或 EAGAIN
的值时,必须关闭套接字,因为发生了一些不可恢复的错误。
对于 non-blocking 套接字,这意味着调用 recv
时没有数据立即可用。对于阻塞套接字),这意味着 tgat 即使在先前使用 setsockopt()
设置的超时(SO_RCVTIMEO
)过期后也没有数据可用。
正如您在上次编辑中正确引用的那样,如果请求的大小为 0,也可以从 recv
返回 0。
How we can know which case happens when recv returns 0?
只需测试提供的 recv 大小(在本例中它是常量数组的大小,因此没有多大意义;但如果它是来自其他地方的变量...):
bufSize = sizeof(buf);
/* further code that, who knows, might affect bufSize */
rlen = read(fd, buf, bufSize);
if(rlen < 0){
if (errno != ETIMEDOUT && errno != EWOLUDBLOCK)
{
/* some error came, let's close socket... */
}
}
else if(rlen == 0){
if (bufSize != 0)
{
/* Close socket */
}
}
我有一个使用非阻塞套接字运行的简单 TCP 服务器。
引用自 recv 联机帮助页;
When a stream socket peer has performed an orderly shutdown, the return value will be 0 (the traditional "end-of-file" return).
The value 0 may also be returned if the requested number of bytes to receive from a stream socket was 0.
当套接字可读时,我用这段代码读取它:
uint8_t buf[2048];
ssize_t rlen;
while(1){
rlen = recv(fd, buf, sizeof(buf), 0);
if(rlen < 0){
/* some error came, let's close socket... */
}
else if(rlen == 0){
/* is there no bytes to read? do we need break; in here? */
/* is socket closed by peer? do we need to close socket? */
}
/* some code that process buf and rlen... */
}
我们如何知道当 recv
returns 0 时发生了哪种情况?
当 recv
returns 0 时,表示套接字已被其他对等点正常关闭,您也可以关闭它。当套接字中没有数据时,返回 -1 并且 errno
设置为 EAGAIN
/ ETIMEDOUT
并且套接字没有被关闭。
最后,当返回 -1 并且 errno
设置为不同于 EWOULDBLOCK
或 EAGAIN
的值时,必须关闭套接字,因为发生了一些不可恢复的错误。
对于 non-blocking 套接字,这意味着调用 recv
时没有数据立即可用。对于阻塞套接字),这意味着 tgat 即使在先前使用 setsockopt()
设置的超时(SO_RCVTIMEO
)过期后也没有数据可用。
正如您在上次编辑中正确引用的那样,如果请求的大小为 0,也可以从 recv
返回 0。
How we can know which case happens when recv returns 0?
只需测试提供的 recv 大小(在本例中它是常量数组的大小,因此没有多大意义;但如果它是来自其他地方的变量...):
bufSize = sizeof(buf);
/* further code that, who knows, might affect bufSize */
rlen = read(fd, buf, bufSize);
if(rlen < 0){
if (errno != ETIMEDOUT && errno != EWOLUDBLOCK)
{
/* some error came, let's close socket... */
}
}
else if(rlen == 0){
if (bufSize != 0)
{
/* Close socket */
}
}