質問者
Socket.Receiveについて

質問
-
こんにちは。
また、Socketについて質問させて下さい。
Socket.Receiveにて、一度
『接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。』
というエラーが発生した後、次回のSocket.Receiveでは
『ブロック不可のソケット操作をすぐに完了できませんでした。』
というエラーが発生してしまいます。
一度、タイムアウトが発生すると、なにかリフレッシュのような処理でもいるのでしょうか?
下にソースの抜粋を書きますので、ご回答頂けると助かります。
よろしくお願いします。
Private _SOH As Integer = &H1
---------------------------------------
Dim buffer(1024) As Byte
Dim returnValue As Integer
Do
Try
_WorkSocket.ReceiveTimeout = 10000
'SOH確認
returnValue = _WorkSocket.Receive(buffer, 1, SocketFlags.None)
If returnValue = 0 Then
'送信側がソケットcloseした
blnStop = True
Exit Do
End If
If _SOH = buffer(0) Then
Exit Do
End If
Catch ex As Exception
’エラー
End Try
Loop
すべての返信
-
返信有難うございます。
SocketOptionとはなんですか?
すみません。お手数お掛けします。
送信側が送ってこない以上、受信側がいくらまっても受信できないのは理解しているんですが、
TCP/IP通信に対する知識は、あまりないんです。
正確には、
①ヘッダ(SOH)の受信
②受信伝文のレングスを知らせる部分の受信
③レングス分の受信
と3段階に分けて受信したくて
①はタイムアウトしても永久Loop
②はタイムアウトしたら①に戻る
③はタイムアウトしたら①に戻る
と考えてるんですが、一度タイムアウトすると『ブロック不可のソケット操作をすぐに完了できませんでした。』になるんです。
因みに、
return = Socket.Receive(buffer, 30, SocketFlags.None)
としても、送られてくる伝文の長さが20の場合
return = 20 で返って来ちゃうんですね。
30まで待って、タイムアウトになるものかと考えてました。タイムアウトは、何も受信しなかった時に発生するのですね。
30になるまで、Socket.Receiveを繰り返して、その際にタイムアウトした場合は、繰り返しも止める
このように考えているのですが、もしかして見当違いなんでしょうか?
長々と申し訳ないです。
-
それは私も体験いたしました。理由はわからないのですが、Receiveのブロッキング呼び出し中に例外が発生すると、Blocking属性がfalseになるらしく、毎回Receive呼ぶ前にUdpSocket.Client.Blocking=trueという文を仕込むようにしました。あとで調べると以下のようなスレッドもありましたが、展開が今ひとつ掴みきれません。
jzkey