日期:2014-05-17  浏览次数:20973 次

c#基于IOCP的SocketAsyncEventArgs服务器端(即时通讯端)如何处理并发客户端连接问题
做过这方面有经验的大哥请不吝赐教,小弟在此感谢十分。异常如下:

源码是Help Viewer 2.0(MSDN)上的示例加并加以改善,为了能便于大家快速查看,只附上示例的关键代码:

public void Start(IPEndPoint localEndPoint)
    {
        listenSocket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        listenSocket.Bind(localEndPoint);
        listenSocket.Listen(100);

        StartAccept(null);    //投递一个接受请求  
    }

public void StartAccept(SocketAsyncEventArgs acceptEventArg)
    {
        if (acceptEventArg == null)
        {
            acceptEventArg = new SocketAsyncEventArgs();
            acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed);
        }
        else
        {
            acceptEventArg.AcceptSocket = null;         //重用前清理
        }
        if (!listenSocket.AcceptAsync(acceptEventArg))  //是否同步完成
        {
            ProcessAccept(acceptEventArg);  //不是则手动投递一个接受请求
        }
    }

void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
    {
        ProcessAccept(e);
    }


private void ProcessAccept(SocketAsyncEventArgs e)
    {
        SocketAsyncEventArgs readEventArgs = m_readWritePool.Pop();
        readEventArgs.UserToken = e.AcceptSocket;

        bool willRaiseEvent = e.AcceptSocket.ReceiveAsync(readEventArgs);
        if(!willRaiseEvent){
            ProcessReceive(readEventArgs);
        }

        StartAccept(e);   // 投递下一个接受请求
    }

以上是核心代码,小弟不才,并未找到有关这方面的处理并发的解决方案,有各位看官,大神伸援手一助!
IOCP SocketAsyncEventArgs 服务端并发 IM服务端 高性能的IOCP服务器

------解决方案--------------------
错误提示说的很清楚了,你的Connection由另一个线程控制,并且处于正在打开的状态,无法调用ExecuteReader。你应该new一个Connection。
------解决方案-------