2013-03-20 115 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

相關問題