2013-02-19 131 views
0

我使用UdpClient发送有关多播地址的数据。UdpClient:发送数据时指定源端口

的代码看起来是这样的:

m_udpclientSender = new UdpClient(); 
m_remoteEndPoint = new IPEndPoint(m_multicastAddress, m_port); 
m_udpclientSender.ExclusiveAddressUse = false; 
m_udpclientSender.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
m_udpclientSender.JoinMulticastGroup(m_multicastAddress, 255); 
m_udpclientSender.ExclusiveAddressUse = false; 
m_udpclientSender.Send(buffer, buffer.Length, m_remoteEndPoint); 

它发送到正确的端口/ IP,但它从一个随机端口(预期)发行,但我需要/想这是从发一个特定的端口(我也发送相同的端口)。

我看到:How to specify source port of a UdpPacket?

但我需要不完全使用地址,如果我给这个在构造函数中,我得到了一个异常(说这已绑定)。

我必须放置相同的端口,因为协议规定响应不应该是多播的。

+0

你的udpclient的对应端已经在指定的端口上侦听了,对吗?所以它知道它必须回答哪个端口(它正在监听的端口)。那么为什么你要指定源端口? – faceman 2013-02-19 10:12:59

+0

mDNS协议定义如果发件人端口不是5353(mDNS端口),则它是UNICAST查询。这意味着我不会在我正在监听的多播组中收到它(而另一个也不会收到此答复)。 – J4N 2013-02-19 11:24:29

+0

我同意David Pfeffer,但在您的代码中,您仍然会遇到ExclusiveAddressUse属性的问题。检查了这一点:[链接](http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.exclusiveaddressuse.aspx)。也许直接使用套接字类会更好。 – faceman 2013-02-19 13:00:03

回答

0

事实上,根据documentation

之前底层套接字绑定到一个客户端端口此属性必须设置。如果调用UdpClient.UdpClient(Int32),UdpClient.UdpClient(Int32,AddressFamily),UdpClient.UdpClient(IPEndPoint)或UdpClient.UdpClient(String,Int32),则客户端端口将作为构造函数的副作用进行绑定,并且您无法随后设置ExclusiveAddressUse属性

因此,设置源端口时无法将ExclusiveAddressUse设置为false。我直接使用了Socket

1

您所做的一切都是正确的,但听起来好像端口的其他用户已经拥有独占端口访问权限。 WinSock不会让你从这个端口发送。

相关问题