1


0

私はファイルをb / wで転送することを可能にするクライアントサーバープログラムを実装しました。 サーバーはソケットの変更をチェックするためにselect()を使用しています。 これ以外のすべてのテストは問題ありません。 - サーバーが巨大なファイルをクライアントに送信しているとき(まだ終了していないとき)、クライアントは "Ctrl + C"を押してクライアントプログラムを終了します。

スニペット:

fprintf(stderr、 "読み取りが完了しました、送信しています... \ n"); if(send(sockClient、sendBuf、chunk_length、0)<0){printf( "ソケット%d \ nの送信に失敗しました"、sockClient); -1を返します。 fprintf(stderr、 "Sending done \ n");

クライアントが強制終了されると、サーバー端末は次のように表示します。

user $。/ server読み込み中、送信中... 送信完了読み込み完了、送信中... 送信完了読み込み完了、送信中... 送信完了読み込み完了、送信中... ユーザー$

どうしたんだ? あなたの答えてくれてありがとう!

3 Answer


4


おそらくSIGPIPEを無視したいでしょう。 サーバーの起動時にこのようなものを追加してみてください。

#include signal(SIGPIPE、SIG_IGN);


0


`send()`呼び出しはソケットが `接続された '状態にあるときにだけ使用されるかもしれません(意図された受信者が知られるように)。 戻り値は送信されたバイト数です…​ `if(send(sockClient、sendBuf、chunk_length、0)<0)`だから切断されると、スキップされた…​


0


MSG_NOSIGNALは移植性がなく、Windowsでは使用できなくなります。