我有需要在一段时间内一些数据发送到服务器的应用程序。 最简单的方法是关闭连接,然后再次打开它时,我想送点东西。 但我要保持连接打开,所以当我要发送数据时,我第一次使用此功能检查连接:
bool is_connected(int sock)
{
unsigned char buf;
int err = recv(sock,&buf,1,MSG_PEEK);
return err == -1 ? false : true;
}
坏的部分是,这是行不通的。 它挂在没有数据接收。 我能做什么? 如何检查,如果连接仍然是开放的?
不要先检查,然后发送。 它的无用功无论如何都不会工作 - 状态可以在您检查,当你发送之间改变。 只要做你想做的事,如果失败处理错误的东西。
要检查状态,请使用:
int error_code;
int error_code_size = sizeof(error_code);
getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &error_code, &error_code_size);
您需要启用非阻塞的行为,通过设置O_NONBLOCK
使用fcntl
。 一个简单但非标准的方式做非阻塞读是使用:
recv(sock, &buf, 1, MSG_PEEK | MSG_DONTWAIT);
然后,你必须如果失败检查errno。 它可能会失败, EAGAIN
或者可以失败, EBADF
或ENOTCONN
等。
显然,对付这种最简单和干净的方法是避免“遗忘”如果套接字连接与否。 如果一旦一个插座断开连接,您会注意到recv
返回0或send
返回EPIPE
。
默认情况下使用TCP的不允许死套接字的非常及时检测(正常关闭之外),所以我会认为,像这样的“is_connected”功能是对所有实际的目的主要是没用的。 考虑实现的应用层保持活动,并跟踪,如果它建立在及时响应(或缺乏)还活着。
编辑:发布后,我看到BoBTFish的链接,这实际上是一回事。