【问题标题】:Multiplexing non-blocking socket IOs with EOF使用 EOF 多路复用非阻塞套接字 IO
【发布时间】:2016-05-03 02:35:41
【问题描述】:

我正在使用 linux select 实现一个非阻塞套接字 IO 反应器。假设服务器和客户端正在通信。如果客户端或服务器宕机,对方应该会收到一个EOF,这可以通过read调用(C函数调用)的返回值来判断。

if(read(fd, ...) == 0) { printf("Endpoint connection failed\n"); }

我的问题是,这个EOF 事件会与读取的其他数据重叠或合并吗?例如,客户端向服务器发送1 byte 并意外立即关闭。如果它们发生的时间非常接近,服务器上的read 是否仍然可以与1 byteEOF 分离?

【问题讨论】:

  • 如果您知道自己在使用 Linux,我建议您避免使用 select 并改用 epoll。或者考虑一个事件库,例如libev...我正在写my own framework,因为我喜欢修补这些东西。你可以看看。

标签: c sockets nonblocking multiplexing


【解决方案1】:

如果对方发送一个字节然后关闭连接,那么你会先读取一个字节,然后next调用read会返回0。

单个read 调用无法同时执行这两种操作 - 因为它必须返回 0 表示关闭,如果读取一些数据则返回非 0。

【讨论】:

    【解决方案2】:

    EOS 将在任何待处理数据之后交付。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2010-10-31
      • 2013-10-15
      • 2011-05-31
      相关资源
      最近更新 更多