请大侠看看用UdpClient做服务器实现高并发的思路

问题描述

小弟最近项目需要,要做个类似于P2P架构的服务器来登记客户端IP和端口实现打洞。因为客户端数据量大概有三千个,所以要求服务器能撑住三千个并发(因为有心跳机制)。因为从没做过socket开发,加上网上的UDP资料也讲得不够深入,所以小弟将实现思路写出来请各路大侠帮忙看看是否合理。先讲个小插曲,小弟曾以为异步就是并发,所以用udpclient一下子BeginReceive了三次,以为这样就能一下子处理三个客户端发来的数据。测试时故意让第一次回调先sleep10秒再EndReceive。测试结果,当三个客户端(分别是为A、B、C)同时发数据时,第一次回调所接收的数据竟然被三次的覆盖掉了,即接收到C、B、C。看来同时多个BeginReceive不可取。好了,有了上面的小插曲,小弟认为UDP无法并行Receive,猜测是系统先收到数据后才会触发回调方法,EndReceive所读取到的数据是由系统冲缓给udpclient的缓冲区的数据,每EndReceive一次UdpClient的缓冲区就会刷新一次,无法保证数据的有序性。既然无法并行读,那只好顺序读了。网上很多的例子都是这样的while(true){lock(this){IAsyncResultiar=udpReceive.BeginReceive(newAsyncCallback(ReceiveCallback),udpReceiveState);receiveDone.WaitOne();Thread.Sleep(100);}}//回调privatevoidReceiveCallback(IAsyncResultiar){UdpStateudpReceiveState=iar.AsyncStateasUdpState;Byte[]receiveBytes=udpReceiveState.udpClient.EndReceive(iar,refudpReceiveState.ipEndPoint);stringreceiveString=Encoding.ASCII.GetString(receiveBytes);//业务处理......receiveDone.Set();}

这种代码跟同步有区别么?小弟认为BeginReceive异步其实就是用了线程,如何发挥线程的作用才是重要的,所以小弟把以上代码稍作修改while(true){lock(this){IAsyncResultiar=udpReceive.BeginReceive(newAsyncCallback(ReceiveCallback),udpReceiveState);}Console.ReadLine();}//回调privatevoidReceiveCallback(IAsyncResultiar){UdpStateudpReceiveState=iar.AsyncStateasUdpState;Byte[]receiveBytes=udpReceiveState.udpClient.EndReceive(iar,refudpReceiveState.ipEndPoint);//马上进入下一次异步接收udpclient.BeginReceive(newAsyncCallback(ReceiveCallback),udpReceiveState);stringreceiveString=Encoding.ASCII.GetString(receiveBytes);//业务处理......}

以上代码的思路就是异步接收,当把数据接收到buffer时,马上告诉udpclient进入下一次异步接收,然后再进行业务逻辑处理。此时是在线程里面发生的,当下一次接收到数据,又是在另一线程里面了,就实现了不同线程处理不同的客户端的数据,所谓的并发了。大概的思路就是这样,不知道可行否,人家的高并发是怎样的呢?请大侠指点

解决方案

解决方案二:
“覆盖掉了”那是你的程序有bug。这种程序bug不去解决,而相当轻率地总结成是udpclient有bug,那么你就没有什么办法好好地玩耍编程了。
解决方案三:
嗯,我没有说udpclient有bug,是我前面的测试方法不可取,所以换了思路。麻烦大侠看看我的思路可行不
解决方案四:
UDP接收的数据来自哪里,楼主应该判断对方的IP地址的,refudpReceiveState.ipEndPoint应该用起来.

时间: 2024-10-26 05:41:33

请大侠看看用UdpClient做服务器实现高并发的思路的相关文章

Windows服务器应对高并发和DDOS攻击的配置方法_win服务器

windows系统本身就有很多机制可以用来提高性能和安全,其中有不少可以用来应对高并发请求和DDOS攻击的情况. 通过以下配置可以改善windows服务器性能: 一.应对高并发请求: 1.TCP连接延迟等待时间 TcpTimedWaitDelay: 这是设定TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间.关闭和释放之间的此时间间隔通称 TIME_WAIT状态或两倍最大段生命周期(2MSL)状态.在此时间内,重新打开到客户机和服务器的连接的成本少于建立新连接.减少此条目的值允许 TC

修改Linux内核参数提高Nginx服务器在高并发时的性能

并发 Linux下高并发的Nginx服务器,当TCP TIME_WAIT套接字数量经常达到两.三万,服务器很容易被拖死.通过修改Linux内核参数,可以减少Nginx服务器的TIME_WAIT套接字数量. vi /etc/sysctl.conf 增加以下几行: 引用 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse =

IIS Web服务器支持高并发设置方法详解_win服务器

适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 1.应用程序池(Application Pool)的设置: General->Queue Length设置为65535(队列长度所支持的最大值)Process Model->Idle Time-out设置为0(不让应用程序池因为没有请求而回收)Recycling->

CentOS 与 Ubuntu:哪个更适合做服务器?

已经决定买一台虚拟服务器,但还不能决定使用哪个 Linux 发行版?我们都经历过这种困扰.对于 Linux 发行版来说,要在这么多的发行版和种种支派flavors中选择一个,那简直能让人崩溃.不过,对于服务器而言,有两个主流的 Linux 发行版,那就是 CentOS 和 Ubuntu.但如何从这两个之中选择,这是摆在管理员.初学者和专业人士面前的主要问题.在对这两个(和更多)发行版有了一定的经验之后,我们决定对这两个发行版用于服务器时做个比较. 利益相关:本文译自 thishosting.ro

select-reactor做服务器最大连接数?

问题描述 reactor做服务器最大连接数? 我是在使用ACE_Select_Reactor时碰到的. 当注册句柄(ACE_Accepto接受连接)超过1016时就会出ACE_Svc_Handler的open失败.(不知是不是reactor中select限制连接数不能超过1024) ulimit -a open file 是10240 ACE_VERSION 6.2.0 Centos 6.6. 请教各位大侠reactor做服务器最大连接数如何调大,希望大家帮忙解决,谢谢! 解决方案 http:/

求助关于VC#的问题,请大侠帮忙解答,多谢了!

问题描述 我在查询按钮的click事件里查询数据表得到了符合条件的多个记录(每个记录包括学号,姓名,成绩等),这多个记录的学号显示在窗体左侧checkedlistbox里,然后单击checkedlistbox里的任一个学号,会在窗体右侧的label中显示该记录的其他信息(姓名,成绩等等),这个该怎么实现啊?我现在只能把所有查询到的符合条件的学号显示在checkedlistbox里,接下来该怎么做呢?该怎么把查询得到的数据传递给右侧的label?不知道我说的清楚不清楚?请大侠帮助,多谢了! 解决方

有个关于菜单的问题请大侠帮忙

问题描述 最近在做一下C/S结构的项目,在项目中想用到像WINDOWS优化大师那样的滑动菜单,想请大侠们帮推荐实现这样菜单的控件,谢谢!<注:不是在网页中用的,是在WinForm中用的>

vs2013工具栏问题-vs2013 中工具栏为什么没有显示完全?请大侠指点

问题描述 vs2013 中工具栏为什么没有显示完全?请大侠指点 vs2013 中工具栏为什么没有显示完全?请大侠指点 解决方案 是不是工具拦宽度限制了. 解决方案二: 这是第三方的控件么?什么语言的,是不是嵌套在什么控件内了. 解决方案三: 将工具栏拖出来,看看后面有没有东西.如果拖出来之后,后面有东西,那说明工具栏宽度不够. 解决方案四: 工具栏宽度怎么设置?CMFCToolsBar里面好像没有这种方法

如何在局域网用本机做服务器,然后另一台机局域网访问我的的网站求详细教程

问题描述 如何在局域网用本机做服务器,然后另一台机局域网访问我的的网站求详细教程 就是我自己做了一个简单的网站,然后想通过自己电脑作为服务器,让我的另一台电脑访问我的网站,要购买域名吗?不怎么明白,求解答,谢谢恩 解决方案 服务起来后把localhost改成做服务器机器的ip就行 解决方案二: 可以不用买域名啊,再说也有免费的域名申请! 你可以用IIs,先配好DNS,先弄好一个Web,在里面弄一个网页文件.设置域名 ip. 就可以用另外一台尝试访问了. 解决方案三: 不需要的,发布在Tomcat