Select()在客户端没有出现

  • 本文关键字:客户端 Select sockets
  • 更新时间 :
  • 英文 :


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

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

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

这个程序读起来很好。。现在,当我拔下那个设备的电源线时,我遇到了问题。

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

但在我的程序中,当我拔下设备的电源线时,在我的客户端程序中,选择不出来意味着客户端插座没有得到任何事件。我不明白为什么。。

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

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

谢谢。

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

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

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

我从来没有亲自尝试过解决这个问题,所以所有这些都只是一些想法,可能会带来一些想法。这里还有一个想法来源。

最新更新