c#基于IOCP的SocketAsyncEventArgs服务器端(即时通讯端)如何处理并发客户端连接问题

Go和分布式IM 2013-02-26 09:00:01
做过这方面有经验的大哥请不吝赐教,小弟在此感谢十分。异常如下:

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

以上是核心代码,小弟不才,并未找到有关这方面的处理并发的解决方案,有各位看官,大神伸援手一助!
...全文
508 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Go和分布式IM 2013-02-27
  • 打赏
  • 举报
回复
确实得测试 3Q
  • 打赏
  • 举报
回复
做并发测试啊。。。 光想是没用的。。。。 多跑跑程序。。
Go和分布式IM 2013-02-26
  • 打赏
  • 举报
回复
public void Start(IPEndPoint localEndPoint)
    {
        listenSocket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        listenSocket.Bind(localEndPoint);
        listenSocket.Listen(100);
 
        StartAccept(null);    //投递一个接受请求  
    }
此处 我没用线程 只是一个MAIN函数调用了一下
Go和分布式IM 2013-02-26
  • 打赏
  • 举报
回复
Go和分布式IM 2013-02-26
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
错误提示说的很清楚了,你的Connection由另一个线程控制,并且处于正在打开的状态,无法调用ExecuteReader。你应该new一个Connection。
引用 2 楼 lye2000000_super 的回复:
错误是在你操作数据的时候。。。。。。 ProcessReceive里是保存?
嗯 一语惊醒梦中人 这个问题好解决 但是 根本上说 上述代码 能够处理几十或一百的并发吗 我就是这地方有点疑问
  • 打赏
  • 举报
回复
有个解决方案。 就是接受多线程。接受的数据保存list里。 保存数据到数据库单线程,,,从list里去保存。
Go和分布式IM 2013-02-26
  • 打赏
  • 举报
回复
嗯 多谢小喵 不过有点懂 有点不懂 似是而非 请问能再明白点吗 我对IOCP接触不久 除了这个并发的问题外 其他的都很强大 不过是卡在这了 网上说多线程 不过我还是没有找到解决方案
  • 打赏
  • 举报
回复
错误是在你操作数据的时候。。。。。。 ProcessReceive里是保存?
devmiao 2013-02-26
  • 打赏
  • 举报
回复
错误提示说的很清楚了,你的Connection由另一个线程控制,并且处于正在打开的状态,无法调用ExecuteReader。你应该new一个Connection。

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧