4

TCPソケット(インターネットドメイン)に基づいたクライアントサーバープログラムを設計およびテストしています。現在、ローカルマシンでテストしていますが、SIGPIPEについて次のことを理解できません。

*。SIGPIPEはかなりランダムに表示されます。それは決定論的である可能性がありますか?

最初のテストでは、クライアントからの単一のsmall(25文字)送信操作と、それに対応するサーバーでの受信が行われました。同じマシン上で同じコードが正常に実行されるかどうか(SIGPIPE)は完全に私の制御不能です。故障率は約45%(かなり高い)です。それで、これを最小限に抑えるために、何らかの方法でマシンを調整できますか?

**。2回目のテストでは、クライアントからサーバーに40000個の小さい(25文字)メッセージ(合計データ1MB)を送信し、サーバーが実際に受信したデータの合計サイズで応答しました。クライアントはタイトループでデータを送信し、サーバーで単一の受信呼び出しがあります。これは、送信された合計データの最大1200バイトに対してのみ機能します。また、これらの非決定論的なSIGPIPEがあり、現在は約70%です(本当に悪い)。

誰かが私のデザインの改善を提案できますか(おそらくそれはサーバーにあります)。要件は、サーバーへの単一のソケット接続が確立された後、クライアントが中程度から非常に大量のデータ(メッセージごとに約25文字)を送信できることです。1つの受信に対して複数の送信を行うと、常に損失が大きくなり、非常に非効率になると感じています。メッセージを組み合わせて、1つのsend()操作のみで送信しますか。それが唯一の道ですか?

4

2 に答える 2

8

接続されていないパイプ/ソケットに書き込もうとすると、SIGPIPE が送信されます。シグナルのハンドラーをインストールすると、代わりに send() がエラーを返します。

signal(SIGPIPE, SIG_IGN);

または、ソケットの SIGPIPE を無効にすることもできます。

int n = 1;
setsockopt(thesocket, SOL_SOCKET, SO_NOSIGPIPE, &n, sizeof(n));

また、言及しているデータ量はそれほど多くありません。おそらくどこかにバグがあり、接続が予期せず閉じて SIGPIPE が発生する可能性があります。

于 2011-03-04T17:16:25.743 に答える