当前位置: 代码迷 >> C# >> 关于SocketAsyncEventArgs的断开有关问题
  详细解决方案

关于SocketAsyncEventArgs的断开有关问题

热度:83   发布时间:2016-05-05 02:36:02.0
关于SocketAsyncEventArgs的断开问题
最近使用了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用来接收

你断开的是侦听,接收并没有断开