0

我只使用 linux 套接字编写了一个客户端套接字程序。这是我在程序中所做的图片的信息

  1. 创建套接字
  2. 与服务器套接字建立连接
  3. 将该套接字分配给选择的读取集和异常集。
  4. 使用 select 方法在单独的线程中给出超时值 NULL

服务器在一台外部设备中运行。

该程序在阅读和所有方面都可以正常工作。现在,当我拔下该设备的电源线时,我遇到了问题。

我假设当我们移除设备的电源线时,所有的插座都会突然关闭,并且连接的客户端插座会收到读取事件。当我们尝试读取时,我们收到读取为零的字节数,这意味着服务器关闭了连接。

但是在我的程序中,当我拔下设备的电源线时,在我的客户端程序中选择没有出现意味着客户端套接字没有收到任何事件。我不明白为什么..

任何关于我们如何知道服务器关闭连接或关闭电源时套接字行为的任何信息的建议都将不胜感激。

我需要你的帮助,这非常关键。

谢谢你。

4

1 回答 1

1

当远程机器突然断网(网线拔掉或断电)时,它无法通知连接的另一端。更重要的是,仅从半开套接字(如您的情况)执行读取的客户端也无法检​​测到这一点。

了解连接丢失的唯一方法是发送数据包。由于发送的所有数据都应得到对方的确认,因此客户端计算机上的 TCP 将不断重试发送未确认的数据部分,直到尝试次数用尽。然后ETIMEDOUT应该返回一个错误(通过预期读取事件的套接字)。您可以再创建一个套接字来定期发送这些消息,以检测客户端上的对等点消失(心跳连接)。但是所有这些重试可能仍需要一些时间。

另一种选择可能是使用SO_KEEPALIVE套接字选项。连接空闲一段时间后,TCP 开始向服务器发送探测消息,并且可以检测到它的消失。空闲项的默认值通常非常大,因此需要对其进行修改。其他一些可能相关的参数(TCP_KEEPCNT、TCP_KEEPINTVL、TCP_KEEPIDLE)。看来,此选项可能在不同系统上以不同方式实现,或者可能根本不存在。

我从来没有亲自尝试过解决这个问题,所以这一切只是一堆可能会给出一些想法的想法。这是另一种想法的来源

于 2012-10-10T08:51:46.713 回答