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