c# - 通过 UDP 的广播是重复发送它的数据包,还是只发送一次?

标签 c# network-programming udp broadcast

使用 C#,通过 UDP 的广播是重复发送它的数据包,还是只发送一次?

我以前从未使用过这项技术,我想通过 LAN 临时广播少量信息(一小行字符串)。如果接收端没有准备好,广播会自动重复还是一次性?我使用的代码来自 here .所以我想在一台机器上启动广播器,几分钟后启动接收器并检索广播器发送的内容。

这是代码

using System;  
using System.Net;  
using System.Net.Sockets;  
using System.Text;  
class Broadcst  
{  
  public static void Main()  
  {  
   Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,  
                ProtocolType.Udp);  
   IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);  
   IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);  
   string hostname = Dns.GetHostName();  
   byte[] data = Encoding.ASCII.GetBytes(hostname);  
   sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast, 1);  
   sock.SendTo(data, iep1);  
   sock.SendTo(data, iep2);  
   sock.Close();  
  }  
}  

最佳答案

UDP 在设计上只发送一次数据包。它没有握手(与 TCP 不同)、纠错或传输保证的概念。除非您手动请求校验和或类似的东西,否则您甚至不能确定您的数据到达了您发送它的地方。

维基百科对此有一个很好的部分:Reliability and congestion control solutions in UDP .

所以,是的,如果您想要可靠性,您将需要实现传输保证代码。但是,如果来自接收方的消息说数据已收到被延迟怎么办?好吧,那么你需要实现某种超时。如果消息丢失了怎么办?您需要将数据重新发送给收件人。您如何知道收件人这次是否收到了?等等……

如果您不想这样做,那么我建议您研究自动为您管理的 TCP。

关于c# - 通过 UDP 的广播是重复发送它的数据包,还是只发送一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9589906/

相关文章:

c - NIC 收到的数据包未通过套接字读取

c# - 从 HttpPostedFile 获取文件路径

c# - 是否有更好的方法强制滚动条值以特定增量并将值绑定(bind)到文本框 (C#)?

c# - 介于另一列的值之间

c# - .NET Ping() 给出错误超时?

linux - 确定 IP header 的大小。为什么和别人不一样?

c# - ASP.NET Web UI ListView 不会刷新

c - 如何用C语言构造ARP请求包

c - 将结构类型的变量发送到套接字

javascript - 从 chrome 发送 udp 数据包