2009-02-28 11 views
3

私は在庫データを受け取り、ソケット(サーバーとして動作する)を介して別のアプリケーションに転送するC++アプリケーションを持っています。小さい秒、私はエラーメッセージ高周波データに対処するには?

「なしバッファスペースで見つかった後

実際WSASend関数は、エラーコード10055と戻る。システムは、十分なバッファ領域を欠いているため、ソケット操作を実行できませんでしまたはキューが満杯だったためです。

数時間で1日のデータ(約130 MB)を受け取っているので、市場の時間の後にアプリケーションを実行したときに問題が発生します(これは比較的大きいと思います)。 私は堅牢性テスト。

私はsetsockopt機能を使用して送信バッファSO_SNDBUFを増やそうとしましたが、それでも同じ問題がありました。 この問題を解決するにはどうすればよいですか?これは受信バッファに関連していますか?

送信詳細:私は重複ソケット

を使用してsendメソッドを呼び出し、各完全なメッセージに対して

EDIT: は、誰かがC++での高頻度データを処理するための一般的なガイドラインを与えることができますか?

+0

どのように各送信が完了するのを待つのですか?IOCP通知、またはOVERLAPPED構造のイベント経由 –

+0

私はこれが問題だと思います:) send関数が完了するまで待ちません。 –

+0

良いもの。あなたのためにそれを修正することを願っています。 –

答えて

6

TCPのフロー制御によって、受信側がソケットの端を十分に高速に処理していない場合、内部の送信バッファがいっぱいになります。エラーメッセージから、Winsockスタックが処理できるかどうかに関わらずデータを送信しているように見えます。どのようにデータを送信しているかを正確に述べることができれば役に立ちますか?あなたは、すべてのデータが到着するのを待っていて、1つの大きなブロックを送信しているか、または断片的に送信していますか?

ノンブロッキングまたはオーバーラップしたソケット経由で送信していますか?いずれの場合も、select()/ WaitForMultipleObjects()ができることを(非ブロッキングソケットのために)示すか、またはオーバーラップしたI/Oが完了し、データがソケット内部の送信バッファに正常にコピーされたことが通知されます。

オーバーラップできるI/Oは一度に複数のバッファをキューに入れることができますが、大量のページをロックしてメモリを枯渇させる可能性があることを慎重に考慮する必要があります。非ページプール。

0

ニックの答えはかなり頭に釘を打つ;あなたは一度に重複したセンドをあまりにも多く開始することによって 'ロックされたページの制限'を使い果たしている可能性が最も高いです。理想的には、あなた自身のメモリバッファにあなたのデータをバッファリングする必要があり、一度に保留中のオーバラップされたセンドのセット数だけを持たなければなりません。 IOCPフレームワークでこのような状況に対処する方法については、http://www.lenholgate.com/blog/2008/07/write-completion-flow-control.htmlおよび関連するTCP受信ウィンドウフロー制御の問題はこちらhttp://www.lenholgate.com/blog/2008/06/data-distribution-servers.htmlここではhttp://www.serverframework.com/asynchronousevents/2011/06/tcp-flow-control-and-asynchronous-writes.htmlです。

私の好ましい解決策は、一度に設定可能な重複した重複送信を許可し、この制限を超えてデータのバッファリングを開始し、保留中の重複送信の完了を使用してバッファされたデータの送信を駆動することです。これにより、非ページプールの量と使用される「ロックされたページ」の量を厳密に制御することができ、多くの接続を可能な限り高速に送信しながら、使用するリソースを制御することが可能になります。

関連する問題