TCP客户端异步套接字回调

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

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

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

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

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

提前致谢!

如果传递包含对套接字的引用的状态对象,则可以访问套接字本身。

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); } 

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

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

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

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

服务器类型代码

简单的套接字代码