0

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

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

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

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

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

提前致谢!

4

3 回答 3

1

你的问题不是很清楚。从你的问题的语气来看,你似乎不想做任何额外的工作。如果没有一些额外的工作,您将无法执行异步操作。

最好的方法是使用 Microsoft 的异步 API,使用 BeginReceive/EndReceive。这些将在套接字关闭时调用您的回调。但是,您不能通过这样做轻松地使用 .NET 中的 IO 流支持,因此会涉及一些额外的工作。

如果你想要更多的控制,你必须做更多的工作。这里的所有都是它的。

于 2009-03-26T16:53:48.743 回答
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 回答
0

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

服务器类型代码

简单的套接字代码

于 2009-03-26T16:57:16.177 回答