Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets Select()未在客户端中显示_Sockets - Fatal编程技术网

Sockets Select()未在客户端中显示

Sockets Select()未在客户端中显示,sockets,Sockets,我只使用linux套接字编写了一个客户端套接字程序。以下是我在程序中所做的信息 创建套接字 与服务器套接字建立连接 将该套接字分配给select的读取集和异常集 使用select方法在单独的线程中为超时值NULL 服务器正在一个外部设备中运行 这个程序对阅读和其他方面都很有效。。现在,当我拔下那个设备的电源线时,我面临着一个问题 我假设,当我们卸下设备的电源线时,所有插座都会突然关闭,连接的客户端插座将被读取。当我们尝试读取时,会收到读取为零的字节数,这意味着服务器关闭了连接 但在我的程序中,当

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

  • 创建套接字
  • 与服务器套接字建立连接
  • 将该套接字分配给select的读取集和异常集
  • 使用select方法在单独的线程中为超时值NULL
  • 服务器正在一个外部设备中运行

    这个程序对阅读和其他方面都很有效。。现在,当我拔下那个设备的电源线时,我面临着一个问题

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

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

    如有任何建议,请告知我们如何得知服务器关闭了连接,或有关关闭电源时插座行为的任何信息

    我需要你的帮助,这很关键


    多谢各位

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

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

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

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

    注意
    select(2)
    不是一个方法,而是一个系统调用。使用
    poll(2)
    可能更好。如果套接字是TCP/IP套接字,则不会突然关闭;IP标准要求宏观延迟(可能是分钟)。请显示您的代码以获得进一步帮助。