Tcpclient / Tcplistner类是否比socket类快

时间:2012-01-12 07:32:08

标签: .net

我的应用程序是用.net编写的,并运行在Windows服务器上。它通过TCP / IP连接远程服务器并继续监听。它只在连接开始时发送一条消息,这是一条登录消息,此后它从不发送任何消息,只是从服务器监听。它的流套接字和数据包不断出现,大约6000个数据包,大小从60字节到200字节不等。到目前为止,我使用套接字类并连接到远程服务器。发送登录请求后,我开始连续接收流。要接收流,我使用BeginReceive,socketflags none。在每次开始接受之后,它会重复这项任务。有没有其他方式以更快的方式接收流。我的应用程序是实时的,非常非常关键。甚至1微秒也很重要。任何人都可以建议。

1 个答案:

答案 0 :(得分:2)

TcpClient只是 SocketNetworkStream之上的包装。它不会更快地运行 - 它只是一个不同的(更方便的)API。此外,正如约阿希姆所说 - 这不太可能是一个真正的瓶颈。

您可以尝试一些想法:

  • 如果使用NetworkStream API,请检查DataAvailable,这表示是否有数据缓冲;如果有,请尝试处理同步(通过几个Read),直到DataAvailable为假,此时切换到 async *({ {1}})
  • 将缓冲消息与处理消息的步骤分开 - 您的计算机很可能有多个核心,而单独的读取循环/进程队列可能会增加吞吐量;你也可以考虑 parallel 处理线程,但这更复杂

在处理远程服务器时,“即使是1微秒的事情”也是不可行的。在那个级别,你也想在垃圾收集上疯狂,可能会查看BeginRead用法(通过struct传递),这与使用ref非常不同,而且不能通过扁平交换改变。和对象池等等非常棘手。