- 締切済み
TCP/IPでSENDエラーになってしまう。
WindowsのTCPでクライアントからサーバに対してsendした際に エラーとなってしまいます。 エラーコードを出力したところ"22"が出力されています。 考えられる事は、大量データの連続送信ですがTCP/IPでは 問題無いと思います。 何か知っているかたおりましたら回答お願い致します。 状況:大量(50K)のデータを連続に送信していると発生 環境:WindowsXP(pro)SP2 VC.net
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- syama2006
- ベストアンサー率38% (14/36)
WSAGetLastError()のエラーコードとして"22"はおかしいように思いますが、大量データを送信する場合の注意事項について記述します。 ・4K,8K,16K,32K,64K程度を一回で送信できます どのサイズが最も性能が高いかは実測することをお勧めします。 ・連続実行については注意が必要です 50Kのデータを4回連続してSENDすると200Kのバッファが必要となります。TCP/IPのカーネルバッファは8K程度ですのでかなり大きなバッファが追加で取られることになります。このバッファは受信側でRECEIVEしてはじめて空になります。空になったことを確認して次のSENDをすればバッファは50Kで抑えることができます。実現方法としては、50KをSENDしたらRECEIVEを発行して受信側の応答を待つ。受信側は50Kのデータを受信したら短い電文でOK/NGをSENDし、RECEIVEで待つ。この繰返しになります。より高い性能を出そうと思ったら、数回SENDしたら1回RECEIVEするなどチューニングができます。 ・WinSockの注意事項 50Kものデータを送信する場合は、1回のSENDデータを1回のRECEIVEで受信できない場合があります。送信データが受信できるまで複数回RECEIVEを発行する必要があります。常に50K一定とは限らないため先頭にデータ長を付加します。RECEIVEでは、まずデータ長を受信し、次にデータ長分のデータを繰返し受信します。 データ長をint型で示す場合でPC(intel)とUNIX(SPARC)を通信する場合はintの表現形式が異なりますので変換が必要となります。 ・その他の注意事項 マシンの負荷が増大して行くとSENDが届かずあるいは受信できずにクライアント・サーバー共にRECEIVE-RECEIVEで通信がハングすることがあります。このRECEIVEのシステムタイムアウトは数時間で非常に長いため、プログラムでタイマを設定しタイマ出口で受信を打ち切る処理が必要です。 TCP/IPを利用する場合は、細かな考慮が必要となりますが、一度作成すればそのソースがノウハウとなり、また流用できますので、がんばって下さい。
50KBものデータを一回のsendで送ることはできないと思います. 通常は,大きなデータを送る場合には,複数回に分けてsendします.
補足をお願いします. 1.connectは成功しているか? 2.エラーコードはWSAGetLastErrorで取得したものか? 3.連続送信とは?50KBのデータを何回も送るのか?50KBを分割して何回かに分けて送ることですか?
補足
回答ありがとうございます。 感謝しています。 1.connectは成功しているか? →成功しています。 2.エラーコードはWSAGetLastErrorで取得したものか? →WSAGetLastErrorで取得したものです。 3.連続送信とは?50KBのデータを何回も送るのか? →4回送信します。 50KBを分割して何回かに分けて送ることですか? →分割はしていません。1回でsendします。 以上