2009-04-14 81 views
8

在C#中,我使用了UdpClient.Receive功能:UdpClient的广播地址接收

public void StartUdpListener(Object state) 
    { 
     try 
     { 
      udpServer = new UdpClient(new IPEndPoint(IPAddress.Broadcast, 1234)); 
     } 
     catch (SocketException ex) 
     { 
      MessageBox.Show(ex.ErrorCode.ToString()); 
     } 

     IPEndPoint remoteEndPoint = null; 
     receivedNotification=udpServer.Receive(ref remoteEndPoint); 
     ... 

但是我得到一个插座例外称该地址不可用,错误代码10049 我该怎么办,以否定这个例外?

回答

16

这里是我目前使用的生产应用程序,一些工作代码JIST(我们已经有了一些额外的在那里处理,其中客户端的服务器应用程序都在一个独立安装运行的情况下)。接收udp通知的工作是接收消息已准备好处理。正如亚当·亚历山大所提到的,你唯一的问题是你需要使用IPAddress.Any,而不是IPAddress.Broadcast。当您想要发送广播UDP数据包时,您只会使用IPAddress.Broadcast。

设置UDP客户端

this.broadcastAddress = new IPEndPoint(IPAddress.Any, 1234); 
this.udpClient = new UdpClient(); 
this.udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
this.udpClient.ExclusiveAddressUse = false; // only if you want to send/receive on same machine. 

并触发一个异步的开始接收使用回调。

this.udpClient.Client.Bind(this.broadcastAddress); 
this.udpClient.BeginReceive(new AsyncCallback(this.ReceiveCallback), null); 

希望这会有所帮助,您应该能够适应它同步工作,没有太多问题。非常类似于你在做什么。如果在此之后你仍然收到错误,那么其他的东西必须使用你试图收听的端口。

所以,澄清。

IPAddress.Any =用于接收。我想听一个到达任何IP地址的数据包。 IPAddress.Broadcast =用于发送。我想发送一个数据包给正在收听的任何人。

+0

你好,在我的情况下,我在同一台机器上广播时出现错误。你有没有这个错误,何解决这个问题 – Smith 2011-08-18 00:23:49

4

你的目的,我相信你会想用IPAddress.Any而不是IPAddress.Broadcast。希望这可以帮助!

0

即错误意味着协议斜面结合到所选择的IP /端口组合。

我还没有在年龄段使用的UDP广播,但我不记得你需要使用不同的IP范围。

0

没有什么错,你已经配置了UdpClient的方式。你有没有尝试过不同的端口号?也许1234已经在您的系统上由另一个应用程序使用。