检查套接字连接或不[复制](Check if socket is connected or not

2019-07-31 13:15发布

这个问题已经在这里有一个答案:

  • 如何找到在C插座连接状态? 9个回答

我有需要在一段时间内一些数据发送到服务器的应用程序。 最简单的方法是关闭连接,然后再次打开它时,我想送点东西。 但我要保持连接打开,所以当我要发送数据时,我第一次使用此功能检查连接:

bool is_connected(int sock)
{
    unsigned char buf;
    int err = recv(sock,&buf,1,MSG_PEEK);
    return err == -1 ? false : true;
}

坏的部分是,这是行不通的。 它挂在没有数据接收。 我能做什么? 如何检查,如果连接仍然是开放的?

Answer 1:

不要先检查,然后发送。 它的无用功无论如何都不会工作 - 状态可以在您检查,当你发送之间改变。 只要做你想做的事,如果失败处理错误的东西。

要检查状态,请使用:

int error_code;
int error_code_size = sizeof(error_code);
getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &error_code, &error_code_size);


Answer 2:

您需要启用非阻塞的行为,通过设置O_NONBLOCK使用fcntl 。 一个简单但非标准的方式做非阻塞读是使用:

recv(sock, &buf, 1, MSG_PEEK | MSG_DONTWAIT);

然后,你必须如果失败检查errno。 它可能会失败, EAGAIN或者可以失败, EBADFENOTCONN等。


显然,对付这种最简单和干净的方法是避免“遗忘”如果套接字连接与否。 如果一旦一个插座断开连接,您会注意到recv返回0或send返回EPIPE



Answer 3:

默认情况下使用TCP的不允许死套接字的非常及时检测(正常关闭之外),所以我会认为,像这样的“is_connected”功能是对所有实际的目的主要是没用的。 考虑实现的应用层保持活动,并跟踪,如果它建立在及时响应(或缺乏)还活着。

编辑:发布后,我看到BoBTFish的链接,这实际上是一回事。



文章来源: Check if socket is connected or not [duplicate]