Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时使用TCP和UDP套接字_C#_Sockets_Tcp_Server_Udp - Fatal编程技术网

C# 同时使用TCP和UDP套接字

C# 同时使用TCP和UDP套接字,c#,sockets,tcp,server,udp,C#,Sockets,Tcp,Server,Udp,我创建了一个简单的服务器,目前使用TCP套接字满足我的所有打包需求。如果某些数据传输最好与TCP一起使用,而其他数据传输最好与UDP一起使用,那么将它们串联使用的最有效方法是什么?你能简单地有两个插座吗?我找不到显示这方面最佳实践的示例代码,而且如果操作不当,似乎很难调试。谢谢 除非使用原始套接字,否则必须有两个单独的套接字用于UDP和TCP通信 TCP和UDP是独立的4级协议 如果使用带有默认选项的套接字,则很可能是TCP套接字 指定创建套接字时要使用的协议-SOCK_流用于TCP,而SOC

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

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

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

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

      很少有一个应用程序允许一个逻辑数据流同时使用这两个数据流,而且几乎不可能可靠地工作

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

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

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

      因此,UDP通常被选为短“一次性”或单消息通知,在这些通知中,可以很容易地在应用程序级别设置超时,或者每个消息都是独立的,而丢失的消息并不重要。当需要发送长时间的连接或大的连续数据流(文件传输等)时,TCP通常是更好的选择