c# - 同时使用 TCP 和 UDP 套接字

标签 c# sockets tcp server udp

我创建了一个简单的服务器,当前使用 TCP 套接字来满足我的所有数据包需求。如果某些数据传输最好使用 TCP,而另一些数据传输最好使用 UDP,那么同时使用它们的最有效方法是什么?可以只用2个 socket 吗?我找不到显示最佳实践的示例代码,而且如果做得不当,似乎很难调试。谢谢!

最佳答案

没有什么可以阻止您拥有 2 个监听套接字,TCP 和 UDP 各一个。然而,通常针对给定应用预先选择通信方法。例如,syslog 协议(protocol)几乎总是仅使用 UDP 实现。另一方面,HTTP 几乎总是仅通过 TCP 实现。有一些协议(protocol)通常同时支持这两种协议(protocol)(例如 NTP、DNS)。

找到一个允许单个逻辑数据流同时使用两者的应用程序是极其罕见的,而且几乎不可能可靠地工作。

但是,如果您确实支持这两种机制,那么调试就很简单,因为每种机制都可以单独处理和调试。

如果您需要可靠的顺序传送,那么 TCP 更容易使用——对于大多数应用程序来说,这是显而易见的选择。通过 TCP 发送的每个字节都保证按照您发送的顺序传送(否则您将收到明显的错误通知),并且两台计算机之间的对等操作系统将根据需要合作尝试重试,以防任何数据包丢失。路线。很多事情你不需要在这里担心。缺点是:(a) 增加了一些开销,(b) 不遵守“消息”边界(即 TCP 传递字节流;接收方不一定将它们放在发送它们的相同离散 block 中因此您必须自己施加消息边界)。

UDP 不保证传送。也就是说,数据包可能仍会被丢弃,但不会通知发送者,您(即您的应用程序)有责任适当处理该问题。同样,数据包的显示顺序可能与发送它们的顺序不同(例如,由于路由路径不同)。另一方面,您发送的数据包就是您收到的数据包,因此您的消息边界保持不变。

因此,UDP 通常被选择用于短的“一次性”或单消息通知,在这种情况下,很容易在应用程序级别设置超时,或者每条消息都是独立的,并且丢失的消息并不重要。而当存在持久连接或需要发送大量连续数据流(文件传输等)时,TCP 通常是更好的选择。

关于c# - 同时使用 TCP 和 UDP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40715620/

相关文章:

c# - 需要有关 TCP 服务器类型的建议以满足此类应用程序

php - TCP套接字连接是否适合连续套接字打开/关闭

c# - params 过载明显的歧义 - 仍然可以编译和工作吗?

c# - 文本解析 - 我的解析器跳过命令

apache-flex - Flex imap库

Java,将输入流保存到文件需要几个小时

c# - 在 C# 中获取/设置文件所有者

javascript - Visual Studio 显示错误

Java通过FIO读取文件

google-app-engine - 如何在 golang 中在 google appengine 上构建 TCP 监听器或服务器?