2012-05-31 89 views
31

我有2个程序,1个用于发送UDP广播消息,1个正在监听此广播。我的问题是,有时当我发送广播时,接收器会收到2条消息。为什么?发送UDP广播,接收多条消息

接收器代码:

public class Receiver { 
    private readonly UdpClient udp = new UdpClient(15000); 
    private void StartListening() 
    { 
    this.udp.BeginReceive(Receive, new object()); 
    } 
    private void Receive(IAsyncResult ar) 
    { 
    IPEndPoint ip = new IPEndPoint(IPAddress.Any, 15000); 
    byte[] bytes = udp.EndReceive(ar, ref ip); 
    string message = Encoding.ASCII.GetString(bytes); 
    StartListening(); 
    } 
} 

发件人代码:

public class Sender { 
    public void Send() { 
    UdpClient client = new UdpClient(); 
    IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 15000); 
    byte[] bytes = Encoding.ASCII.GetBytes("Foo"); 
    client.Send(bytes, bytes.Length, ip); 
    client.Close(); 
    } 
} 
+0

嗨。我想用你的代码来传输UDP文件。但我不知道如何处理接收部分!应该如何实施?它将如何开始从网络中获取内容? – Shamim

+0

@Shamim,网上有很多资源,有点Google搜索应该有所帮助。查找服务器/客户端示例。 –

+0

'IPEndPoint ip = new IPEndPoint(IPAddress.Any,15000);'只能是'IPEndPoint ip = null;' - 它不是结构体。它在'EndReceive()'方法中的用途是定义发送者。用任何东西填充它都有点误导。 – maxp

回答

26

严格地说,在IP网络数据包的复制被允许的网络行为,你必须能够处理在你的软件中使用它,即使你这次会以某种方式摆脱它。如果你只是想知道为什么会在你的特定情况下发生这种情况......乍一看,我没有看到你的代码有问题。你的计算机的以太网端口上是否有多个IP地址?我认为wireshark可能有助于获取有关正在发生的更多细节。

+5

你的问题回答了。当我通过电缆连接时,笔记本电脑的无线设备也已打开。所以我通过有线和无线接收了这个包。谢谢。 –

6

UDP数据包不可靠,您可能会得到相同的数据包两次甚至完全没有数据,使用udp时,您需要在数据中包含某种唯一ID,以便丢弃错误或请求重新发送。