3

我正在让一个客户端进程使用 xinetd 启动一个服务器进程。据我了解,服务器能够通过其 STDIN 从客户端读取,并通过其 STDOUT 写入客户端。由于各种原因(主要是让服务器能够使用 select() 然后 read() 或 recv() )我希望能够以某种方式将 STDIN 和 STDOUT 转换为套接字,然后在其上执行普通套接字 I/O,就像我的服务器将连接到的其他服务器一样。

这可以做到吗?这甚至是一个有意义的问题吗?

4

1 回答 1

1

您提到的所有函数调用都可用于编号为 STDIN_FILENO 和 STDOUT_FILENO的文件描述符<unistd.h>(来自)。所以我敢冒险你不需要任何改造。

编辑:有点不正统,但是您是否尝试过在 STDOUT_FILE 上写入或在服务器中读取 STDIN_FILENO ?通过快速浏览 xinetd 代码,它看起来只是将打开的套接字 fd 复制到服务器的所有 fd。也许您可以将其中任何一个用作全双工。

我只看了这里

  for ( fd = 0 ; fd <= MAX_PASS_FD ; fd++ )
   {
      if ( dup2( descriptor, fd ) == -1 )
      {
     msg_resume();
         msg( LOG_ERR, func,
               "dup2( %d, %d ) failed: %m", descriptor, fd ) ;
         _exit( 1 ) ;
      }
   }
于 2013-05-23T18:42:10.780 回答