问题描述
小弟不才,开始想偷工减料,用C#结合国外的IPworks控件,写一个中等并发高数据流高动态的服务器,但是经常连不了多少用户,底层的IPworks服务器控件IPDeamon类,经常会卡住,整个服务器就不再具备通信能力了。监视线程发现,所有的线程都在Ipdeamon类的m_server.Connections[connectionid].DataToSendB=e.TextB,也就是类似Socket的Send函数上阻塞了。查了很多资料,目测这个控件是采用的是同步+阻塞的方式,而我的服务器数据流并发性要求200个以上,并且每个链接数据流很大(1-2K/S,每秒都在发)。最初我用的是事件响应,然后直接在响应函数中转发数据,后来我听了一个朋友的建议,把Send函数放到线程池中,但是现象还是一样的,会把整个服务器阻塞。各位大大有没有什么建议?我的服务器设计是这样的,要能够同时支持200个以上的用户连进来,然后用户不停的发数据,我的服务接收到用户的数据,要完全转发给另一边的服务器(这个用的商用软件),然后等到另一边服务器给我发数据过来,每秒都发(数据量1-2KB/S,总带宽平均需要2M),然后我本地编辑过并重新编解码以后,再转发给用户。调试了半个月,发现IpWorks的服务器控件可能还是不能适用于我
解决方案
解决方案二:
博客园有个supersocket你可以看下。另外IPWorks是否支持异步通信?如果能,改成异步模式应该能解决你的问题。
解决方案三:
引用1楼的回复:
博客园有个supersocket你可以看下。另外IPWorks是否支持异步通信?如果能,改成异步模式应该能解决你的问题。
在IPworks的说明里,他声称已经是异步结构了,我作为服务器,是不是应该采用非阻塞模式呢?我现在出的问题就是会看到所有的线程都停留在Send函数那里,这是阻塞的问题么?
解决方案四:
我想是的。咋到非技术区了。
时间: 2024-09-20 07:28:41