はい、できます...しかし、それを行うイベントループを各マシンにプログラムする必要があります(つまり、ソケットレイヤーはそれを行いません)。
私が行う方法は、各マシンにselect()の周りでイベントループを実行させ、2つのノンブロッキングソケット(1つは受信データ用、もう1つは送信データ用)を使用することです。各プロセスには、転送するデータの一部を一時的に保存するために使用する小さな (8kB?) 内部バッファーがあります。
次に、選択ループは次のルールで動作します。
1) internal-buffer がフル未満の場合は常に、incoming-data-socket に読み取り準備が整ったときに通知を受け取りたいことを select() に伝えます。
2) internal-buffer が空である場合は常に、select() に、outgoing-data-socket に書き込み可能なバッファ スペースがある場合に通知するように指示します。
3) select() が、incoming-data-socket に読み取る準備ができているデータがあることを示すたびに、incoming-data-socket からいくつかのデータを一時的なローカル バッファーに読み取ります。(読み取る量は、incoming-data-socket で利用可能なデータ量と、ローカル バッファーで利用可能なスペース量のどちらか小さい方によって制限されます)
4) select() が、outgoing-data-socket に書き込み用のバッファー スペースがあることを示す場合はいつでも、一時的なローカル バッファーからいくつかのデータを outside-data-socket に書き込みます。(書き込む量は、incoming-data-socket に存在するデータの量と、発信ソケットが現在受け入れることができるスペースの量のいずれか小さい方によって制限されます)
上記のロジックを考えると、バイトは各ノードから次のノードへかなりパイプライン化された方法で流れます。
(エラー処理と、socket()、connect() または bind()/listen()/accept() によるソケットの設定についてはここでは説明しませんが、これも必要です)