将STDIN重定向到socket,将socket重定向到STDOUT

将STDIN重定向到socket,将socket重定向到STDOUT,c,sockets,file-descriptor,C,Sockets,File Descriptor,我正在尝试为服务器开发一个简单的命令行客户端。连接到服务器并正确设置所有内容后,我希望将STDIN重定向到连接到服务器的套接字,并将同一套接字重定向到STDOUT。我想实现类似于nc工具的行为 最简单的解决方案是使用select()和read()/write()将数据从STDIN传递到套接字,并从套接字传递到STDOUT 是否有其他更简单的方法将套接字连接到STDIN/STDOUT?我考虑过使用dup2()系统调用。然而,我不知道如何使它工作 谢谢。在Linux上,您可以使用splice(2)在

我正在尝试为服务器开发一个简单的命令行客户端。连接到服务器并正确设置所有内容后,我希望将
STDIN
重定向到连接到服务器的套接字,并将同一套接字重定向到
STDOUT
。我想实现类似于
nc
工具的行为

最简单的解决方案是使用
select()
read()
/
write()
将数据从
STDIN
传递到套接字,并从套接字传递到
STDOUT

是否有其他更简单的方法将套接字连接到
STDIN
/
STDOUT?
我考虑过使用
dup2()
系统调用。然而,我不知道如何使它工作


谢谢。

在Linux上,您可以使用
splice(2)
在内核级别的文件描述符之间移动数据。尽管如此,您仍然必须使用
select(2)
(或等效工具)来并行处理两个方向,或者使用两个线程。

另一种可能性是在程序中进行协议握手,一旦套接字就绪,就以
socat
的形式执行程序以执行数据转发


例如,调用
dup2
将套接字复制到文件描述符3中,取消设置其close-on-exec标志,然后执行
socat-STDIO-FD:3

,因此您希望保持stdin打开,将数据从stdin复制到套接字,并将数据从套接字复制到stdout?dup不会帮你的。是的,这正是我想要的。
dup2
在那种情况下是无用的@salva呃这是为什么?@LtWorf:因为
dup2
不会在文件描述符之间移动数据,这正是OP想要做的。它只是将同一个文件对象从某个文件描述符分配给另一个文件描述符。他只需将服务器分叉,将套接字复制到stdin/stdout/stderr,然后执行一个shell,就不需要所有这些。@LtWorf:没有shell可以执行
exec
!谢谢FreeBSD上没有
接头(2)
。它是否等同于
sendfile(2)
?@MichalPietras:FreeBSD
sendfile(2)
的手册页上说,目标FD必须是一个套接字,因此您可以使用它在stdin和套接字之间移动数据,而不是在套接字和stdout之间移动数据。@salva为什么如果有shell,它不需要select(2)涉及?什么是socat?我在FreeBSD中没有看到类似的内容。@MichalPietras:。我确信它可以从FreeBSD端口集合中获得。