書き込みモードでソケットをシャットダウンした後、複製されたハンドルに書き込もうとしています。私はそれらの両方が異なるファイル記述子を持っていても、パイプが壊れています。私のコードで何が間違っていますか?それとも期待された行動ですか?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)'を使ってみました。両方とも仕事をしなかった。誰でも助けることができますか?
あなたは何が起こると思われるのか、その理由を説明できますか? –
'shutdown'は、通信の変更について他の当事者に通知するTCP/IPパケットを送信します。基底のネットワークソケットが変更されました。同じネットワークソケットを参照する2つのファイルディスクリプタがあるということは、両方のディスクリプタからソケットへの変更が見えることを意味します。 – Myst