2013-02-19 2 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

+0

Протокол mDNS определяет, что ЕСЛИ порт отправителя НЕ является 5353 (порт mDNS), это запрос UNICAST. Это означает, что я не получу его в группе многоадресной передачи, которую я слушаю (и этот другой тоже не получит этот ответ). – J4N

+0

Я согласен с Дэвидом Пфеффером, но в вашем коде у вас все еще будет проблема с свойством ExclusiveAddressUse. Проверьте это: [link] (http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.exclusiveaddressuse.aspx). Вероятно, вам было бы лучше использовать класс сокета. – faceman

ответ

0

В самом деле, в соответствии с documentation:

Это свойство должно быть установлено перед основной сокет привязан к порту клиента. Если вы вызываете UdpClient.UdpClient (Int32), UdpClient.UdpClient (Int32, AddressFamily), UdpClient.UdpClient (IPEndPoint) или UdpClient.UdpClient (String, Int32), клиентский порт связан как побочный эффект конструктора, и вы не можете впоследствии установить свойство ExclusiveAddressUse

Таким образом, при установке порта источника нельзя установить значение ExclusiveAddressUse равным false. Я использовал Socket напрямую

1

Вы сделали все правильно, но похоже, что другой пользователь порта уже имеет эксклюзивный доступ к порту. WinSock не позволит вам отправлять данные из этого порта.

Смежные вопросы