プロが教えるわが家の防犯対策術!

winsockの動作について、質問させていただきます。

(1)UDPのsendto()でWSAEADDRNOTAVAIL(10049)が発生する。
数十個(64個以内)のUDPソケットを用意し、for()ループで全てのソケットから送信した場合、途中からエラー(WSAEADDRNOTAVAIL)が発生してしまいます。
あて先のアドレス/ポートは全て同一なので、原因は別にあるのではないかと考えています。

sendto()と次のsendto()の間にスリープを入れると、WSAEADDRNOTAVAIL(10049)が発生しなくなるのは確認しました。
一度に処理できる数が決まっているといったような、制限があるのでしょうか?


(2)TCPのconnect()に時間がかかる。
TCPクライアントのconnect()に30秒くらいかかる事があります。
connect()はノンブロッキングで実行し、その後にselect()を繰り返し呼んで接続の確認をしているのですが、その間にWSAGetLastError()でエラーを確認するとWSAEWOULDBLOCK(10035)となっています。
パケットをダンプすると"SYN"が送信されていないため、TCPクライアント側の問題だと考えています。

connect()が一瞬で成功する場合もあるため、なにか問題があるのではないかと思っているのですが、30秒くらいかかる場合もあるのでしょうか?
※(1)のUDPの送信処理を行った直後に、このTCPのconnect()を行うと時間がかかるような気がしています。

よろしくお願いします。

A 回答 (1件)

(1)TCP/IPプロトコルスタックの内部バッファが埋まっているのでは?


(2)(1)と同様にTCP/IPプロトコルスタックに処理が溜まっているのでは?

内部動作の詳細は知らないけどユーザプロセスとは別のプロセスだかスレッドだかで処理しているんじゃなかったかな。それだとプロセススイッチのオーバーヘッドを減らすため、呼び出しプロセスが待ちに入るまで実際の処理の開始を遅延していると思う。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
勉強不足で、いまひとつ理解は出来ていないのですが。。

(1)については、setsockopt()で送信バッファのサイズを指定したところ、WSAEADDRNOTAVAIL(10049)が発生しなくなりました。
サイズに0を指定してバッファリングを無効にする、といったことも出来るようなので、いろいろ試してみたいと思います。

お礼日時:2007/04/04 14:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A