【发布时间】:2013-07-24 03:47:21
【问题描述】:
当断开连接发生时,我正在尝试“捕捉”。 但我实际上不明白出了什么问题。 recv() 返回 0,errno 设置为 0,ioctl 返回 0。我在网上搜索了 6 个小时,但没有成功。谁能告诉我怎么了?
问候。
bool Network::setBlocking(bool blocking)
{
// sets blocking or non-blocking mode.
int flags = blocking ? 1 : 0;
return ioctl(this->sockfd, FIONBIO, &flags) ? false : true;
}
NetworkStatus Network::status()
{
// returns socket status.
struct timeval tv;
fd_set fd;
int result = 0;
tv.tv_sec = 3;
tv.tv_usec = 0;
FD_ZERO(&fd);
FD_SET(this->sockfd, &fd);
result = select(this->sockfd + 1, &fd, 0, 0, &tv);
if(result == -1)
{
return NETWORK_ERROR;
}
else if(result)
{
return NETWORK_READYREAD;
}
else
{
return NETWORK_TIMEOUT;
}
}
int Network::bytesAvailable()
{
// returns number of bytes available.
int bytes = 0;
if(ioctl(this->sockfd, FIONREAD, &bytes) < 0 || errno)
{
return -1;
}
return bytes;
}
int Network::read(char *buffer, int size)
{
// reads data from socket.
return recv(this->sockfd, buffer, size, 0);
}
...
int main(int argc, char* argv[])
{
Network net;
...
while(true)
{
switch(net.status())
{
...
case NETWORK_READYREAD:
{
int bytesAvailable = net.bytesAvailable();
char temp[bytesAvailable];
int len = net.read(temp, bytesAvailable);
printf("len: %d\nerrno: %d\nbytesAvailable: %d\n", len, errno, bytesAvailable); // len: 0, errno: 0, bytesAvailable: 0
break;
}
}
} // status
return 0;
}
【问题讨论】:
-
是的,我不明白问题出在哪里。你到底在期待什么?
-
我期望返回-1。因为当套接字关闭时,它应该在错误时返回 -1。非阻塞套接字可以接收 0 字节,这意味着还没有可用的数据,我不太明白我应该检查什么。
-
不,当没有数据时你会得到一个“错误”,当有断开连接时你会得到 0。不要认为“错误”意味着错误。接受它并继续前进:) 你得到了你应该得到的——这很奇怪,但它是正确的。
-
我不明白-.-