请注意问题是关于仅在套接字上使用异步回调模式!
我想构建一个TCP客户端,它会在收到数据包时以及关闭套接字时通知我,因为NET提供的带有beginRecv的功能,endRecv不通知连接是否仍然可用。< / p>
我的问题: 是否有办法像使用WinAPI一样创建TCP客户端?
我的意思是用一条消息调用WSAAsyncSelect,当收到消息时,它调用你在WSAAsyncSelect中调用的函数,然后你可以通过WParams FD_CLOSE FD_READ FD_WRITE查看连接是否已关闭或是否有新数据包。
如果没有。我不能同时控制我的连接和我的传入数据包吗?我不想一直调用BeginRecv EndRecv。 -.-
提前致谢!
答案 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)