套接字上的线程太慢

问题描述 投票:1回答:1

我正在使用Visual Studio Express 2013开发用于移动计算机的服务器,该服务器实现套接字服务器以接收其连接。

它使用Net.Sockets.TcpListener.AcceptSocket将连接分配给Net.Sockets.Socket。它为创建的每个新套接字启动一个新的Threading.Thread,并有一段时间用于接收,解析数据并将数据写入套接字。它使用属性x.Available获取数据计数,并使用x.Receive(buffer, datalen, Net.Sockets.SocketFlags.None)读取该数据。它解析接收到的数据并创建答案。最后,它使用x.Send(answerbuffer, answerdatalen, Net.Sockets.SocketFlags.None)传输答案。

该代码在接收和发送答案时可以正常工作,但是速度很慢。

我对代码进行了一些检查,以获取代码每次操作所用的时间,然后得出平均值:-套接字读取数据并将其从缓冲区复制到列表(字节):100-200毫秒-数据解析和创建应答缓冲区列表(以字节为单位):150-300毫秒-将(字节的)缓冲区列表转换为缓冲区的字节数组和套接字发送:70-200 ms

请记住,数据包的数据接收约为150个字节长,数据传输的数据约为100个字节长,线程的每个执行部分的时序都很高。因此,当服务器收到更多的连接时,答案会变慢或停止一会儿。

在服务器上为每个连接使用套接字和线程的这种方法不好吗?是否搜索其他类来管理数据流或线程并行执行?Visual Studio表达在使用线程方面有一些限制吗?

谢谢您的帮助。Matteo

.net multithreading sockets visual-studio-2013
1个回答
1
投票

这种在服务器上为每个连接使用套接字和线程的方法不好吗?

是的,非常糟糕。线程根本无法扩展,此外:如果每个套接字使用线程,则几乎可以保证意外或恶意的DDOS。

您可以大约如果仅连接到几个套接字,那么就不必在客户端使用每线程线程数。在服务器上:那简直就是死亡。

服务器套接字IO几乎总是使用异步IO完成的。这变得非常复杂[[really fast]],尤其是在谈论后台缓冲区等问题时,但是:在这种情况下,现代.NET中提供了一个全新的API:“管道”-处理所有线程,内存池,以及后缓冲管理for you。但是,[不能在Visual Studio 2013上运行,所以...如果可能的话进行更新?如果对此感兴趣,我有一个multi-part saga on using pipelines如果不可能,那么开始的好地方可能是SocketAsyncEventArgs,但同样:这是一个[[真的很深的兔子洞

,坦率地说,这基本上是一个已解决的问题。如果您可以切换到预发布的实现,则建议使用。
© www.soinside.com 2019 - 2024. All rights reserved.