0

質問は、ソケットでのみ非同期コールバック モードを使用することに関するものであることに注意してください

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

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

メッセージで WSAAsyncSelect を呼び出すことを意味します。メッセージが受信されると、WSAAsyncSelect で呼び出した関数が呼び出され、接続が閉じられているか、WParams FD_CLOSE FD_READ FD_WRITE を介して新しいパケットがあるかを確認できます。

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

前もって感謝します!

4

3 に答える 3

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);
}
于 2009-03-26T21:41:20.690 に答える
1

あなたの質問は本当に明確ではありません。質問の調子からすると、余分な作業はしたくないようですね。追加の作業がなければ、非同期を行うことはできません。

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

より多くの制御が必要な場合は、より多くの作業を行う必要があります。それだけです。

于 2009-03-26T16:53:48.743 に答える