首页 > 解决方案 > 即使连接被对等套接字终止,选择也会返回成功

问题描述

我无法理解 select 系统调用的使用。根据选择文档,选择将在超时或套接字准备好进行 I/O 操作后返回。这是什么意思socket is ready for I/O operation

  received_len  = 0
  do {
       /* There is only one fd in readfds */
       rv = select(fd+1, &readfds, NULL, NULL, timeout)
       if (rv < 0){
           /*socket select failed.*/
           break
       }else if (rv == 0){
           /*socket timeout.*/
           break
       }else
           /* Go for reading */
           readbytes = read(fd, (buf + received_len), (expected_len - received_len))
           if (readbytes < 0)
           {
               /*read fail*/
               break
           }
           received_len += readbytes; 
           
   }while(received_len < expected_len)

我虽然选择会在对等套接字连接关闭时超时。但是在关闭对等连接后,选择返回 1 并且读取发生在套接字上。然后 read 调用返回 0 (这基本上意味着对等端终止)。我认为 select 会超时,因为套接字还没有准备好进行读取操作,但这并没有发生。

标签: csocketsunix

解决方案


从您在问题中引用的文档中

读取文件

监视此集中的文件描述符以查看它们是否已准备好读取。如果读取操作不会阻塞,则文件描述符已准备好读取;特别是,文件描述符在文件结束时也已准备好。


推荐阅读