2009-03-26 23 views
0

非同期コールバックモードはソケットにのみ使用してください。TCPクライアント非同期コールバックモード

NETがbeginRecvで提供する機能のため、パケットが受信されたときとソケットが閉じられているときに私に通知するTCPクライアントを構築したいのですが、endRecvは接続がまだ利用可能かどうか通知しません。

私の質問: WinAPIを使用するのと同じようにTCPクライアントを作成する方法はありませんか?

メッセージでWSAAsyncSelectを呼び出すと、WSAAsyncSelectで呼び出された関数がメッセージを受け取ったときに呼び出され、接続が閉じているか、WParams FD_CLOSE FD_READ FD_WRITEによって新しいパケットがあるかどうかを確認できます。

私は接続と受信パケットを同時に制御できませんか?私はいつもBeginRecv EndRecvを呼びたくはありません。 -.-

ありがとうございます!

+0

非同期である必要がありますか、またはあなたが望むようにスレッド版を作成できますか? – sfossen

+0

これはクライアントまたはサーバーですか?聞いていますか、接続していますか? – sfossen

答えて

1

あなたのソケットへの参照が含まれて状態オブジェクトを渡すと、あなたは、ソケット自体にアクセスすることができます。

public class SocketState 
{ 
    public SocketState(Socket s) 
    { 
    this._socket = s; 
    } 

    private Socket _socket; 
    public Socket Socket 
    { 
    get{return _socket;} 
    } 
} 


void SomeFunction() 
{ 
//do some stuff in your code 

SocketState stateObject = new SocketState(mySocket); 
mySocket.BeginReceive(buffer, offset, size, flags, CallBack, stateObject); 
//do some other stuff 
} 

public void CallBack(IAsyncResult result) 
{ 
    SocketState state = (SocketState)result.AsyncState; 
    state.Socket.EndReceive(result); 

    //do stuff with your socket. 
    if(state.Socket.Available) 
    mySocket.BeginReceive(buffer, offset, size, flags, CallBack, state); 
} 
1

あなたの質問は本当に明確ではありません。あなたの質問の調子で、あなたは余分な仕事をしたくないようです。余計な作業をすることなく非同期を行うことはできません。

BeginReceive/EndReceiveを使用して、Microsoftの非同期APIを使用するのが最適な方法です。これらは、ソケットが閉じられたときにあなたのコールバックを呼び出すでしょう。ただし、これを行うことで.NETでIOストリームサポートを簡単に使用することはできないため、余分な作業が必要になります。

さらに制御したい場合は、もっと多くの作業を行う必要があります。それがすべてです。

+0

@Mystere Man、私がBeginDisconnectを呼び出すと、ソケットがサーバーによって切断されたときにプログラムがコールバックを実行することを期待している間に、切断されます。 私はBeginRecv、EndRecvでうまくいくと感じますが、接続がまだ生きているかどうかはわかりません。だから私はとても怒っています。 解決策を提供できますか? –

+0

接続が有効かどうかを通知する必要はありません。接続が切断されたときに通知する必要があります。 EndReceiveは例外または0バイトを返すことでこれを行います。 –

0

また、ソケットを監視してイベントを通知し、コールバックを呼び出すための簡単なスレッドバージョンを作成することもできます。

Server type code

Simple Socket code

関連する問題