none
Socket.Receiveについて RRS feed

  • 質問

  • こんにちは。
    また、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

    2009年6月11日 12:29

すべての返信

  • SocketOptionは設定していますか? それ以前にSocketクラスに限らずTCP/IP通信に関する知識はありますか?

    一般に、送信側は1byte送信と言われてもすぐには送信しません。送られてこない以上、受信側はいくら待っても受信できないでしょう。
    こういったTCP/IPの特性を理解した上でプログラムを組む必要があります。
    2009年6月11日 13:19
  • 返信有難うございます。
    SocketOptionとはなんですか?
    すみません。お手数お掛けします。

    送信側が送ってこない以上、受信側がいくらまっても受信できないのは理解しているんですが、
    TCP/IP通信に対する知識は、あまりないんです。

    正確には、

    ①ヘッダ(SOH)の受信
    ②受信伝文のレングスを知らせる部分の受信
    ③レングス分の受信

    と3段階に分けて受信したくて

    ①はタイムアウトしても永久Loop
    ②はタイムアウトしたら①に戻る
    ③はタイムアウトしたら①に戻る

    と考えてるんですが、一度タイムアウトすると『ブロック不可のソケット操作をすぐに完了できませんでした。』になるんです。

    因みに、
    return = Socket.Receive(buffer, 30, SocketFlags.None)
    としても、送られてくる伝文の長さが20の場合
    return = 20 で返って来ちゃうんですね。
    30まで待って、タイムアウトになるものかと考えてました。タイムアウトは、何も受信しなかった時に発生するのですね。
    30になるまで、Socket.Receiveを繰り返して、その際にタイムアウトした場合は、繰り返しも止める

    このように考えているのですが、もしかして見当違いなんでしょうか?

    長々と申し訳ないです。



    2009年6月11日 13:57
  • それは私も体験いたしました。理由はわからないのですが、Receiveのブロッキング
    呼び出し中に例外が発生すると、Blocking属性がfalseになるらしく、毎回
    Receive呼ぶ前にUdpSocket.Client.Blocking=trueという文を仕込むようにしました。

    あとで調べると以下のようなスレッドもありましたが、展開が今ひとつ掴みきれません。

    jzkey
    2009年6月14日 18:39