标签:c tcp sockets nonblocking
这不是一个问题,我只是在寻找一些指导:)
我正在编写一些抽象的tcp服务器,它应尽可能少地使用线程.
目前它以这种方式工作.我有一个线程在做侦听和一些工作线程.监听器线程只是坐着等待客户端连接我希望每个服务器实例都有一个监听器线程.工作线程正在客户端套接字上执行所有读/写/处理作业.
所以我的问题是建立有效的工人流程.我遇到了一些我无法解决的问题.工作者代码是这样的(代码非常简单,只是为了显示我有问题的地方):
List<Socket> readSockets = new List<Socket>();
List<Socket> writeSockets = new List<Socket>();
List<Socket> errorSockets = new List<Socket>();
while( true ){
Socket.Select( readSockets, writeSockets, errorSockets, 10 );
foreach( readSocket in readSockets ){
// do reading here
}
foreach( writeSocket in writeSockets ){
// do writing here
}
// POINT2 and here's the problem i will describe below
}
因为while循环再次循环,所以它可以全部接受100%的CPU使用率,如果我让我的客户端正在执行send-> receive->断开例程,那不是那么痛苦,但是如果我试着保持活着那么发送 – >接收 – >发送 – >重新接收它真的吃掉所有CPU.所以我的第一个想法是在那里睡觉,我检查是否所有套接字都发送了他们的数据,然后将Thread.Sleep放入POINT2只持续了10ms,但是这10ms之后产生了10ms的巨大延迟,当我想接下来的时候从客户端套接字的命令..例如,如果我不尝试“保持活动”命令正在10-15毫秒内执行,并保持活着它变得更糟至少10毫秒:(
也许这只是一个糟糕的建筑?可以做什么,以便我的处理器不会获得100%的利用率,我的服务器会尽快对客户端套接字中出现的内容做出反应?也许有人可以指出它应该维护的非阻塞服务器和架构的一个好例子?
解决方法:
先看看TcpListener课程.它有一个不会阻塞的BeginAccept方法,并会在有人连接时调用你的一个函数.
另请参阅Socket类及其Begin方法.这些工作方式相同.只要某个事件触发,就会调用其中一个函数(回调函数),然后就可以处理该事件.所有Begin方法都是异步的,因此它们不会阻塞,也不应该使用100%的CPU.基本上你想要BeginReceive阅读和BeginSend写作我相信.
您可以通过搜索这些方法和异步套接字教程在Google上找到更多信息. Here’s how以这种方式实现TCP客户端.即使对于您的服务器,它的工作方式基本相同.
这样你就不需要任何无限循环,它都是事件驱动的.
标签:c,tcp,sockets,nonblocking 来源: https://codeday.me/bug/20190621/1258579.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。