2013-03-20 37 views
2

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

最简单的解决办法是使用select()并使用read()/write()STDIN传递数据到插座并从插座向STDOUT

是否有任何其他以某种方式套接字连接到到STDIN/STDOUT?我想过使用dup2()系统调用简单的方法。但是,我不确定如何使其工作。

谢谢。

+0

所以你想保持打开标准输入并将数据从stdin复制到套接字,并将数据从套接字复制到标准输出? dup不会帮你的。 – Joni 2013-03-20 22:16:57

+0

是的,这正是我想要的。 – 2013-03-20 22:52:11

+1

'dup2'在这种情况下是无用的! – salva 2013-03-21 10:44:20

回答

1

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

+0

他可以分叉服务器,将套接字复制到stdin/stdout/stderr,并执行一个shell,不需要这么做。 – LtWorf 2013-03-21 10:49:00

+0

@LtWorf:'exec'没有shell! – salva 2013-03-21 10:57:06

+0

谢谢。在FreeBSD上没有'splice(2)'。它相当于'sendfile(2)'吗? – 2013-03-21 13:08:18

0

另一种可能性是在你的程序中进行协议握手,一旦套接字准备就绪,执行程序socat来执行数据转发。

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

+0

什么是socat?在FreeBSD中我没有看到类似的东西。 – 2013-03-21 14:23:07

+0

@MichalPietras:[socat](http://www.dest-unreach.org/socat/)。我确定它可以从FreeBSD ports集合中获得。 – salva 2013-03-21 14:30:38

相关问题