同时使用TCP和UDP套接字

时间:2016-11-21 08:22:51

标签: c# sockets tcp server udp

我创建了一个简单的服务器,当前使用TCP套接字满足我的所有打包需求。如果某些数据传输最好与TCP和其他UDP一起使用,那么串联使用它们的最有效方法是什么?你能简单地拥有2个插座吗?我找不到显示最佳实践的示例代码,如果做得不正确,似乎很难调试。谢谢!

2 个答案:

答案 0 :(得分:2)

没有任何东西可以阻止您拥有2个侦听套接字,每个套接字用于TCP和UDP。然而,通常为给定的应用预先选择通信方法。例如,syslog协议几乎总是仅使用UDP实现。另一方面,HTTP几乎总是仅通过TCP实现。有一些协议通常支持两者(NTP,DNS是示例)。

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

但是,如果你同时支持这两种机制,那么调试很简单,因为每个都可以单独处理和调试。

如果您需要可靠的顺序交付,TCP更容易使用 - 对于大多数应用程序来说,显而易见的选择。通过TCP发送的每个字节都保证按您发送的顺序传送(或者您将收到明确的错误通知),并且两台机器之间的对等操作系统将根据需要合作尝试重试以防任何数据包被丢弃。路线。很多东西你不需要担心这里。缺点是:(a)一些增加的开销,以及(b)“消息”边界不受尊重(即,TCP传递字节流;接收器不一定将它们放在发送它们的相同离散块中所以你必须自己强加消息边界。)

UDP不保证交付。也就是说,数据包可能仍然被丢弃,但没有通知发送者,并且您(即您的应用程序)有责任妥善处理。同样,数据包可能以不同于您发送的顺序显示(例如,由于路由路径不同)。另一方面,您发送的数据包是您收到的数据包,因此您的信息边界保持不变。

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

答案 1 :(得分:1)

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

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