2011-07-29 34 views
1

- 私は、2つのプロセスがUNIXドメインソケットで話しているアプリケーションを実行しています。メッセージの大半をソケットの上に渡されるが正しく処理されますが、メッセージのバイト数が、私はエラーを取得して起動する一定の限界をexcedesとき:Sendto失敗したC++ // POSIX.4

sendto failed: Message too long (POSIX.f) 

私はそのは私に言って何を理解しています。私はメッセージの長さを変更することはできませんし、特にメッセージを分割する時間を費やすことは望ましくありません - そして、そのすべてを同じコンピュータに入れるので、このドメインソケット上でメッセージの長さを制限する必要はありません。

ドメインソケットに書き込み可能なメモリの量を増やす方法はありますか、ソケットの初期化/ sendto/recvfromコールに間違いがあり、制限が課されている可能性がありますか?使用していたsend/recvバッファーはかなり大きかった(エラーを引き起こすメッセージよりもかなり大きかった)。

答えて

3

ストリームまたはデータグラムソケットを使用していますか?ストリームソケットの場合、2番目または3番目の書き込みを実行して残りのデータを送信することができます。それらがデータグラムソケットの場合、おそらくスタックしています(おそらくストリームソケットに切り替えることはできますか?)しかし、制限を増やすにはsetsockoptオプションがあるかもしれません。しかし、限界を上げることができない場合に備えて準備をする必要があるかもしれません。本質的に問題は、カーネルが潜在的に大量のデータを保持する責任を負う必要があり、リソースが枯渇し、DoSにつながる可能性があるため、カーネルは(非常に正当な理由で)それがあなたのために保持するデータの量。

+0

それはデータグラムソケットであり、結論は出てきましたが、ストリームソケットに切り替えるのは良い考えです。私はsetsockoptを最初にチェックアウトします。 - とても有難い :) –

関連する問題