TCP客户端异步套接字回调

时间:2009-03-26 16:46:44

标签: c# asynchronous sockets client

请注意问题是关于仅在套接字上使用异步回调模式

我想构建一个TCP客户端,它会在收到数据包时以及关闭套接字时通知我,因为NET提供的带有beginRecv的功能,endRecv不通知连接是否仍然可用。< / p>

我的问题: 是否有办法像使用WinAPI一样创建TCP客户端?

我的意思是用一条消息调用WSAAsyncSelect,当收到消息时,它调用你在WSAAsyncSelect中调用的函数,然后你可以通过WParams FD_CLOSE FD_READ FD_WRITE查看连接是否已关闭或是否有新数据包。

如果没有。我不能同时控制我的连接和我的传入数据包吗?我不想一直调用BeginRecv EndRecv。 -.-

提前致谢!

3 个答案:

答案 0 :(得分:1)

你的问题不是很清楚。根据你的问题,你似乎不想做任何额外的工作。没有一些额外的工作,你不能做异步。

最好的方法是使用Microsoft的Asynchronous API,使用BeginReceive / EndReceive。这些将在套接字关闭时调用您的回调。但是,通过执行此操作,您无法轻松地在.NET中使用IO Stream支持,因此需要进行一些额外的工作。

如果你想要更多的控制,你必须做更多的工作。这就是它的全部内容。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

您还可以编写一个简单的线程版本来监视套接字并为您提供事件并调用回调。

Server type code

Simple Socket code