我正在让一个客户端进程使用 xinetd 启动一个服务器进程。据我了解,服务器能够通过其 STDIN 从客户端读取,并通过其 STDOUT 写入客户端。由于各种原因(主要是让服务器能够使用 select() 然后 read() 或 recv() )我希望能够以某种方式将 STDIN 和 STDOUT 转换为套接字,然后在其上执行普通套接字 I/O,就像我的服务器将连接到的其他服务器一样。
这可以做到吗?这甚至是一个有意义的问题吗?
您提到的所有函数调用都可用于编号为 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 ) ;
}
}