2016-08-15 4 views
1

書き込みモードでソケットをシャットダウンした後、複製されたハンドルに書き込もうとしています。私はそれらの両方が異なるファイル記述子を持っていても、パイプが壊れています。私のコードで何が間違っていますか?それとも期待された行動ですか?Linuxプログラミング:複製ソケットへの書き込みに失敗する

int clientDupFD = dup(fileDescriptors[0]); 

shutdown(fileDescriptors[0], SHUT_WR); 

printf ("\n Client: Writing to shutdown(SHUT_WR) socket"); 

writeOk = write(clientDupFD, msgPtr="Writing message after partial shutdown!", 5); 

if(writeOk == -1) { 
    printf("\n ERR-%s: write() failed to write msg to socket", strerror(errno)); 
} 
else { 
    printf("\n Client: Message '%s' successfully written to socket", msgPtr); 
} 

また、これをCodeLiteで実行すると、完全な出力(最後のprintfs)が実行されないのですが、なぜですか?

デバッガで試してみると、 "ERR-Broken pipe"というprintf文が実行され、出力が出力されていることがわかります。私は 'setbuf(stdout、NULL)'と同様に 'fflush(stdout)'を使ってみました。両方とも仕事をしなかった。誰でも助けることができますか?

+1

あなたは何が起こると思われるのか、その理由を説明できますか? –

+0

'shutdown'は、通信の変更について他の当事者に通知するTCP/IPパケットを送信します。基底のネットワークソケットが変更されました。同じネットワークソケットを参照する2つのファイルディスクリプタがあるということは、両方のディスクリプタからソケットへの変更が見えることを意味します。 – Myst

答えて

1

接続の書き込み方向がシャットダウンされると、接続で書き込みが実行されなくなり、実装ではデータがもう到着しない相手と通信することが自由になります。接続にアクセスするためにどのようなハンドルを使用するかは関係ありません。同じ接続です。

+0

私は今すぐ、他のFDを生かし続けるclose()コールを使用する必要があることを知りました。printfsのフラッシュに関する他の質問にお手伝いできますか? – user691197

+0

破損パイプエラーは、その 'printf'の前に発生します。破損したパイプを修正すると、プログラムは完了するまで実行されます。 (あなたが何をしようとしているのか、また何を期待しているのか、あなたが質問したら多くの助けになるでしょう。なぜシャットダウンか何をしようとしているのか分かりません。 ) –

+0

私はLinuxでソケットプログラミングを勉強しているので、ソケットから作成/クローズ/読み取り/書き込みを試みています。私は、シャットダウンされたソケットに書き込んだ場合に起こることをテストしていました。どのように私は壊れたパイプをキャッチし、エラーの理由(Javaでtry/catchと同様の何か?)を印刷するには – user691197

1

FDをシャットダウンしている(または両方のFDに接続されている接続が正確に)ため、書き込みが失敗します。

ソケットペアを作成する場合は、socketpair(またはpipe)を使用してください。

+0

彼はFDではなく*接続*をシャットダウンしました。彼は別のFDを持っています。 –

+2

確かに、 'dup()' FD間で共有される接続は1つだけです。 – abligh

関連する問題