Sockets Select()未在客户端中显示
我只使用linux套接字编写了一个客户端套接字程序。以下是我在程序中所做的信息Sockets Select()未在客户端中显示,sockets,Sockets,我只使用linux套接字编写了一个客户端套接字程序。以下是我在程序中所做的信息 创建套接字 与服务器套接字建立连接 将该套接字分配给select的读取集和异常集 使用select方法在单独的线程中为超时值NULL 服务器正在一个外部设备中运行 这个程序对阅读和其他方面都很有效。。现在,当我拔下那个设备的电源线时,我面临着一个问题 我假设,当我们卸下设备的电源线时,所有插座都会突然关闭,连接的客户端插座将被读取。当我们尝试读取时,会收到读取为零的字节数,这意味着服务器关闭了连接 但在我的程序中,当
多谢各位 当远程机器突然切断网络(网络电缆拔出或断电)时,它无法通知连接的另一端。更重要的是,仅从半开放套接字执行读取的客户端(如您的情况)也无法检测到这一点 了解连接丢失的唯一方法是发送数据包。由于发送的所有数据都应由另一方确认,因此客户端计算机上的TCP将继续尝试发送未确认的部分数据,直到尝试次数用尽为止。然后应返回
ETIMEDOUT
错误(通过预期读取事件的套接字)。您可以再创建一个套接字,定期发送这些消息,以检测客户端上的对等点消失(心跳连接)。但所有这些尝试可能仍需要一些时间
另一个选项是使用SO_KEEPALIVE
socket选项。连接空闲一段时间后,TCP开始向服务器发送探测消息,并可以检测到其消失。空闲项的默认值通常非常大,因此需要修改它们。其他一些可能相关的参数(TCP_keepnt、TCP_KEEPINTVL、TCP_KEEPIDLE)。看起来,此选项可能在不同的系统上以不同的方式实现,也可能根本不存在
我个人从来没有尝试过解决这个问题,所以所有这些都只是一些想法,可能会给出一些想法。这里还有一个。注意select(2)
不是一个方法,而是一个系统调用。使用poll(2)
可能更好。如果套接字是TCP/IP套接字,则不会突然关闭;IP标准要求宏观延迟(可能是分钟)。请显示您的代码以获得进一步帮助。