C# 当UDP当前正在发送数据包时,您的程序能否通过TCP接收信息?

C# 当UDP当前正在发送数据包时,您的程序能否通过TCP接收信息?,c#,tcp,udp,C#,Tcp,Udp,现在,我很想知道——如果我有一个通过TCP连接到服务器的程序,服务器向我的程序发送一条消息,但我同时发送UDP数据包,TCP数据包会到达我这里吗?所有的东西都在一节课上 谢谢你的帮助 简短回答-是。 您可以同时拥有多个连接,所有发送和接收连接;假设您有多个套接字 您没有提到服务器必须处理的客户机数量,也没有提到您正在对发送/接收的数据做什么。 根据您的实现,可能还需要多个线程(正如Dariusz Wawer指出的,这不是必需的,但我提到了它们,因为可以处理大量客户端的可扩展解决方案可能会使用线程

现在,我很想知道——如果我有一个通过TCP连接到服务器的程序,服务器向我的程序发送一条消息,但我同时发送UDP数据包,TCP数据包会到达我这里吗?所有的东西都在一节课上


谢谢你的帮助

简短回答-是。 您可以同时拥有多个连接,所有发送和接收连接;假设您有多个套接字

您没有提到服务器必须处理的客户机数量,也没有提到您正在对发送/接收的数据做什么。 根据您的实现,可能还需要多个线程(正如Dariusz Wawer指出的,这不是必需的,但我提到了它们,因为可以处理大量客户端的可扩展解决方案可能会使用线程)

查看TCP和UDP端口上的这篇文章,了解更多信息:


在这里可以找到一个很好的C#教程示例:

取决于您所说的“同时”是什么意思。通常答案是“是”,您可以有多个TCP/IP连接和多个UDP套接字同时发送和接收


除非你真的担心延迟——几微秒可能会给你带来麻烦。如果是这样的话,一个连接可能会干扰另一个连接。

你的问题实际上是所有网络应用程序程序员必须知道和考虑的几个问题的边界。 首先:所有从网络接收的数据都存储在操作系统的内部缓冲区中,等待读取。缓冲区不是无限的,因此如果等待足够长的时间,可能会丢弃一些数据。通常写入其中的数据块是单个数据包,但并不总是这样。您永远不能对TCP/IP通信中有多少数据可供读取做出任何假设。另一方面,在UDP中,必须始终读取单个数据包,否则数据将丢失。您可以使用
recvfrom
读取UDP数据包,我建议您使用它

其次:使用阻塞和非阻塞方法是您的网络应用程序最重要的决定之一。互联网上有很多关于它的信息:,或

至于线程:线程不需要编写多连接处理程序应用程序。有时他们会简化您的代码,有时他们会使它运行得更快。有一些众所周知的使用线程的编程模式,比如在单独的线程中处理每个单独的连接。通常情况下,特别是对于没有经验的程序员来说,使用线程只会导致奇怪的错误和头痛


我希望我的帖子能够回答您的问题,并在下面的另一个答案中阐述我一直在进行的讨论。

是的,我确实有单独命名的套接字-谢谢您的帮助@DariuszWawer,除非您在处理要写入的信息时尝试处理正在读取的信息…@HaemEternal,线程和套接字读/写是完全不相关的主题!只有在使用线程时,线程安全才适用。您可以编写完美的单线程应用程序来处理多个连接。@DariuszWawer这是真的,我并不是在谈论线程安全,而是在尝试建议一个有效工作的好实现。您是对的,这不是线程问题,而是线程可能变得重要的问题。我编辑了我的文章,试图反映这一点。@HaemEternal抱歉,我仍然不能同意你的观点。只有当有足够的工作来填充单个内核时,线程才能提高效率。否则,只会产生多线程开销,而没有任何好处。一个好的实现应该是简单、干净和可读的——同样,线程通常不会帮助实现这些目标。