Rya*_*nch 3 c# asynchronous tcp
我目前正在创建一个Windows服务,它将创建到多台机器的TCP连接(所有机器上的相同套接字),然后从这些机器监听"事件".我正在尝试编写代码来创建连接,然后生成一个线程,该线程侦听等待来自机器的数据包的连接,然后解码通过的数据包,并根据数据包的有效负载调用函数.
问题是我不完全确定如何在C#中做到这一点.有没有人有任何有用的建议或链接可以帮助我这样做?
在此先感谢您的帮助!
根据您计划支持的并发客户端数量,每个连接的线程架构可能会很快崩溃.原因是,每个线程都需要大量资源.默认情况下,每个.NET线程获得1MB的堆栈空间,因此每个连接1MB加上任何开销.
相反,当支持多个连接的客户端时,您通常会使用非常有效的异步方法(因为这里也是如此),因为Windows将使用"完成端口",这基本上可以让线程在等待某个事件完成时执行其他操作.
为此,您将查看BeginAccept,BeginReceive,BeginSend等方法.
一种更简单的方法也可以避免进行阻塞调用并避免多线程,这是在循环中使用Socket.Select方法.这允许单个线程为多个套接字提供服务.线程一次只能物理地读取或写入单个套接字,但想法是检查多个套接字的状态,这些套接字可能包含也可能不包含要读取的数据.
在任何情况下,线程每连接方法最初都要简单易懂,但它确实存在严重的可伸缩性问题.我建议首先使用Accept,Receive,Send等同步方法.然后再重构代码以使用异步方法,这样就不会耗尽服务器的内存.