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);   // 投递下一个接受请求
    }

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

9 个解决方案

#1


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

#2


错误是在你操作数据的时候。。。。。。
 ProcessReceive里是保存?

#3


嗯 多谢小喵 不过有点懂 有点不懂 似是而非 请问能再明白点吗 我对IOCP接触不久 除了这个并发的问题外 其他的都很强大 不过是卡在这了 网上说多线程 不过我还是没有找到解决方案

#4


有个解决方案。
就是接受多线程。接受的数据保存list里。
保存数据到数据库单线程,,,从list里去保存。

#5


引用 1 楼 devmiao 的回复:
错误提示说的很清楚了,你的Connection由另一个线程控制,并且处于正在打开的状态,无法调用ExecuteReader。你应该new一个Connection。




引用 2 楼 lye2000000_super 的回复:
错误是在你操作数据的时候。。。。。。
 ProcessReceive里是保存?


嗯 一语惊醒梦中人 这个问题好解决 但是 根本上说 上述代码 能够处理几十或一百的并发吗 我就是这地方有点疑问 

#6



							     

#7


public void Start(IPEndPoint localEndPoint)
    {
        listenSocket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        listenSocket.Bind(localEndPoint);
        listenSocket.Listen(100);
 
        StartAccept(null);    //投递一个接受请求  
    }
此处 我没用线程 只是一个MAIN函数调用了一下 

#8


做并发测试啊。。。
光想是没用的。。。。
多跑跑程序。。

#9


确实得测试 3Q

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2019 ITdaan.com

赞助商广告