使用STDIN / STDOUT作为套接字

时间:2013-05-23 17:51:44

标签: perl sockets stdout stdin inetd

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

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

1 个答案:

答案 0 :(得分:1)

您提及的所有函数调用都可以在文件描述符上使用,编号为STDIN_FILENO和STDOUT_FILENO(来自<unistd.h>)。所以我敢冒险你不需要任何转变。

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

我只看了here

  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 ) ;
      }
   }