TCP服务器的要求:
目前,我一直在使用C#异步方法,但我发现在大约20个连接时总是会遇到延迟。我的意思是用15到20秒的时间才能得到结果。在大约5-10个连接时,获得结果的时间几乎是即时的。
实际上,当tcp服务器收到消息时,它将与dll交互,dll会进行一些处理以返回结果。不太清楚它背后的工作流是什么,但是在小范围内您没有看到任何问题,所以我想问题可能是在我的TCP服务器上。
现在,我正在考虑使用同步方法。这样做,我将有一个while循环来阻止accept方法,并在accept之后为每个客户端生成一个新线程。但在100个连接中,这绝对是过头了。
IOCP的机会,不完全确定,但它似乎是一个连接池,因为它处理tcp的方式非常类似于正常的方式。
对于这些TCP方法,我也不确定每次需要传递消息时打开和关闭连接是否是更好的选择。平均而言,每个客户端在5-10分钟的间隔内传递消息.
另一种选择可能是使用web (查看一般处理程序)来形成与服务器的1条连接。任何需要处理的消息都将传递给这个通用处理程序,然后这个处理程序从服务器发送和接收消息。
需要特别是那些大规模使用TCP的人的建议。我没有100台电脑供我测试,所以对我来说很难。语言明智的C#或C++就行了,我更熟悉C#,但会考虑以更快的速度移植到C++。
发布于 2010-08-15 17:47:27
你一定做错了。我亲自编写了基于C#的服务器,它可以处理1000+连接,每秒发送超过1条消息,响应时间<10 C#,在普通硬件上。
如果您有如此高的响应时间,那么导致阻塞的必须是您的服务器进程。可能是锁上的争用,可能是简单的错误代码,可能是阻塞外部访问导致线程池耗尽。不幸的是,有很多方法可以把这件事搞砸,而且只有很少的方法能把它做好。这里有很好的指导方针,从Rick的高性能Windows编程文章中介绍的基本原理开始,研究SocketAsyncEventArgs示例,该示例涵盖了自版本3.5中的套接字性能增强出现以来.Net中最具表现力的套接字应用程序编写方式等等。
如果您发现自己在前面的任务中迷失了方向(就像看起来恰好是这样),我会敦促您接受一个已经建立的通信框架,也许是带有网络绑定的WCF,并使用WCF的声明式服务模型编程。这样,您就可以在WCF的性能上重新发挥作用了。虽然这对某些人来说可能还不够,但在性能方面,它会让你走得足够远,远比你现在确定的更远。
发布于 2010-08-15 17:32:11
我不明白为什么在这种情况下C#应该比C++更糟糕--很可能您还没有找到处理传入连接的“正确方法”。为每个客户端生成一个单独的线程肯定是朝着正确方向迈出的一步,假设每个线程的工作负载更多地受I/O约束,而不是CPU密集型。无论是每个连接生成一个线程,还是使用线程池来管理多个线程,这是另一回事--而且还需要通过实验来确定,同时还要考虑是否有100个客户端是您最大的!
https://stackoverflow.com/questions/3488438
复制相似问题