看过坛子里以前有兄弟提到过检查对端关闭连接用poll和available的组合,在异步socket下试了下,好像有点问题,以下是相关代码        public void OnAccept(IAsyncResult ar)
        {
            try
            {
                Socket cListener = (Socket)ar.AsyncState;
                m_cSocket = cListener.EndAccept(ar);
                m_cSocket.BeginReceive(m_BBuffer, 0, m_BBuffer.Length, SocketFlags.None, OnReceive, m_cSocket);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }        public void OnReceive(IAsyncResult ar)
        {
            Socket sc = (Socket)ar.AsyncState;
            
            try
            {
                if (sc.Poll(-1, SelectMode.SelectRead))
                {
                    if (sc.Available > 0)
                    {
                        int nReceived = sc.EndReceive(ar);
                        if (nReceived > 0)
                        {
                            string sReceived = Encoding.ASCII.GetString(m_BBuffer, 0, nReceived);
                             m_cSocket.BeginReceive(m_BBuffer, 0, m_BBuffer.Length, SocketFlags.None, OnReceive, m_cSocket);                       
                         }                    }
                    else
                    {                        m_cSocket.Shutdown(SocketShutdown.Both);
                        m_cSocket.Close();
                        m_cListener.Close();
                        m_cListener = null;
                    }
                }            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }问题在sc.poll这里,每次当我的客户端发送第一个消息的时候比如一个字母"a",sc.Poll(-1, SelectMode.SelectRead)就block住了,没响应,客户端接着发送一个消息"b",这个时候sc.Poll(-1, SelectMode.SelectRead)才返回,我的服务端能接受到之前的那个消息"a",如此反复,客户端的最后一个消息收不到,不知道是什么原因,既然发第一个消息的时候beginreceive都能检测到有消息到来,而进入onReceive函数,为什么poll确检查不到可写呢?