none
非同期接続beginConnectの接続後の処理 RRS feed

  • 質問

  • Public Sub callbackConnect(ByVal ar As IAsyncResult)
        Dim client As Socket = CType(ar.AsyncState, Socket)
        client.EndConnect(ar)
    End Sub

    Public Function connetct() As Boolean
        Try
            g_client = New TcpClient
            g_client.beginConnect(g_StrIpAdr, g_iPort, New AsyncCallback(AddressOf callbackConnect), g_client)
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function


    上記のようなコードでクライアントアプリでサーバに対して接続しようとしているのですが
    実行時、サーバに接続した後、赤色のところで
    「型 'System.Net.Sockets.TcpClient' のオブジェクトを型 'System.Net.Sockets.Socket' にキャストできません。」
    というエラーが発生します。
    サンプルではこのようなキャストでうまくいくようなのですが・・・

    Public Sub callbackConnect(ByVal ar As IAsyncResult)
        g_client.EndConnect(ar)
    End Sub


    コールバックされる関数を上記のように書き直すとうまくいっているように見えるのですが
    接続語の処理はこのような書き方でも大丈夫なのでしょうか。
    別スレッドで接続処理を終了していると考えても大丈夫でしょうか。
    また、BeginConnectでのタイムアウトを設定するとしたらどうしたらいいでしょうか。
    2007年4月10日 12:56

すべての返信

  • TcpClient については触った事がないため詳しい事が言えませんが、
    g_client.beginConnect の 4番目に渡している引数の g_client の型が TcpClient になっています。
    TcpClient.BeginConnect メソッド のドキュメントを参照すると 4番目の引数がAsyncCallback デリゲートに渡されるとあります。
    そのため、赤色のコードの ar.AsyncState の中には 4番目の引数の TcpClient 型が入っており、Socket に変換できないんだと思います。
    2007年4月14日 11:47