繁体   English   中英

检查插座是否已连接[重复]

Check if socket is connected or not [duplicate]

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

我有一个应用程序需要在某个时间将一些数据发送到服务器。 简单的方法是关闭连接,然后当我想发送东西时再次打开它。 但是我想保持连接打开,所以当我想发送数据时,我首先使用这个函数检查连接:

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

不好的是,这不起作用。 当没有数据要接收时它会挂起。 我能做什么? 如何检查连接是否仍处于打开状态?

3 个回复

不要先检查再发送。 这是浪费的努力,无论如何都无法工作 - 状态可以在您检查和发送时间之间发生变化。 只要做你想做的事情,如果失败就处理错误。

要检查状态,请使用:

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

您需要通过使用fcntl设置O_NONBLOCK来启用非阻塞行为。 一种简单但非标准的非阻塞读取方法是使用:

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

之后,您必须检查errno是否失败。 它可能会因EAGAIN失败,或者可能因EBADFENOTCONN等而失败。


显然,处理这个问题最简单,最干净的方法是避免“遗忘”,如果套接字是否已连接。 一旦recv返回0或send返回EPIPE您将注意到套接字是否断开连接。

TCP的默认使用不允许非常及时地检测死套接字(在正常闭包之外),所以我建议像这样的“is_connected”函数对于所有实际目的来说都是无用的。 考虑实施应用层保持活动,并根据及时响应(或缺乏响应)跟踪它是否存活。

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

1 Ember Pre4:如何检查插座是否已连接?

如何检查应用程序模板中是否已连接插座? 在renderTemplate()中,我想检查是否实际需要连接插座(出于性能原因)。 最终代码应类似于以下内容: 我试图通过以下方式使用容器来查找应用程序视图: container.lookup("view:application)但这实例化了 ...

5 检查插座是否闭合

我有一个连接到某些服务器的应用程序。 它可以同步发送数据(发送和等待答案),并异步接收数据。 我做了2个线程。 在无限循环的第一个线程中,我发送数据并等待答案。 在第二个线程中,我从服务器中收集数据并将其推入队列。 但是,如果在发送数据(在第一个线程中)时发生了一些错误,则必须关闭套接 ...

6 检查插座是否在紧凑型框架中连接

我有一个在Windows桌面上运行并在.net中开发的服务器软件,该软件始终在侦听套接字通过TCP / IP的传入连接。 然后,我有一个在CE 6.0上运行的客户端软件,该客户端软件是使用紧凑型框架3.5开发的...此客户端需要: 启用服务后连接到服务器 每300毫秒发送 ...

8 检查HttpClient是否已连接

但是,使用httpClient执行POST请求的问题是,即使由于目标API已关闭而没有连接,它也不会返回任何错误。 是否可以预先检查目的地是否可用? 不使用PING ...

10 检查kinect是否已连接

我正在创建一个使用kinect移动对象的WPF / C#应用程序,但它也可以使用鼠标运行。 目前,我使用鼠标注释掉kinect代码以使其正常工作。 我需要一种方法来识别kinect是否已连接,因此我不必注释掉代码即可在不使用kinect时使用鼠标(不像当前那样抛出异常),而在使用kinect ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM