2013-02-19 123 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不會讓你從這個端口發送。

相關問題