繁体   English   中英

同时使用TCP和UDP套接字

[英]Simultaneous use of TCP and UDP sockets

我创建了一个简单的服务器,该服务器当前使用TCP套接字满足所有数据包需求。 如果某些数据传输最好与TCP结合使用,而另一些数据与UDP结合使用,则最有效的方式是串联使用它们? 您可以简单地使用2个插座吗? 我找不到能显示最佳实践的示例代码,而且如果执行不当,似乎很难调试。 谢谢!

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

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

但是否则,如果您确实支持这两种机制,则调试将很简单,因为每种方法都可以单独进行处理和调试。

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

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

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

除非使用原始套接字,否则必须具有两个用于UDP和TCP通信的单独套接字。

  • TCP和UDP是独立的OSI 4级协议。
  • 如果您使用具有默认选项的套接字,则很可能是TCP套接字。
  • 您可以在创建套接字时指定要使用的协议SOCK_STREAM用于TCP, SOCK_DGRAM用于UDP。
  • C#可能具有更具可读性的选项,而不是SOCK_STREAMSOCK_DGRAM
  • 如果确实使用原始套接字,则可以通过解析IP标头来区分协议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM