最近使用了SocketAsyncEventArgs做一个IOCP的服务程序,从网上找了一个例子做了一下,
在使用的过程中发现,Socket的连接、接收、发送都OK,但断开有一个问题,
当我想断开一个连接后,用如下语句:
socketserver.Disconnect(socketAsync.AcceptSocket);
发现这个连接还能接收数据,但再用这个连接发送数据时,就报错了,错误如下:
其他信息: 由于以前的关闭调用,套接字在那个方向已经关闭,发送或接收数据的请求没有被接受。
socketserver是一个类,其中的Disconnect方法如下:
/// <summary>
/// 断开此SOCKET
/// </summary>
/// <param name="sock"></param>
public void Disconnect(Socket sock)
{
try
{
sock.BeginDisconnect(false, AsynCallBackDisconnect, sock);
}
catch
{
}
}
void AsynCallBackDisconnect(IAsyncResult result)
{
Socket sock = result.AsyncState as Socket;
if (sock != null)
{
sock.EndDisconnect(result);
}
}
请高手看看,为什么断开了连接还能收数据?
------解决思路----------------------
断开的是Connect/Accept的那个连接
接受的是你Bind的那个地址
------解决思路----------------------
既然你用了异步监听,你应该知道,虽然没有显式的使用线程,也没有显式的new许多socket
但是它其实是多线程的,也会为每个连接建立一个socket用来接收
你断开的是侦听,接收并没有断开