Обнаружение сети устройств SSDP: никогда не получайте ответаC#

Место общения программистов C#
Ответить
Anonymous
 Обнаружение сети устройств SSDP: никогда не получайте ответа

Сообщение Anonymous »

Мне нужно найти устройства UPnP в моей сети. Есть несколько примеров, но, используя два разных подхода, я так и не получил ответа.
Использование UdpClient:

Код: Выделить всё

using (UdpClient udpClient = new())
{
udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, 0));

IPAddress multicastAddress = IPAddress.Parse("239.255.255.250");
udpClient.JoinMulticastGroup(multicastAddress);

byte[] requestBytes = Encoding.UTF8.GetBytes("M-SEARCH * HTTP/1.1\r\nHost: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\r\nST: ssdp:all\r\nMX: 3\r\n\r\n");
IPEndPoint remoteEndPoint = new(multicastAddress, 1900);

await udpClient.SendAsync(requestBytes, requestBytes.Length, remoteEndPoint);
DateTime startTime = DateTime.Now;

while (DateTime.Now - startTime < timeout)
{
try
{
UdpReceiveResult result = await udpClient.ReceiveAsync().
WithTimeout(timeout - (DateTime.Now - startTime));
string response = Encoding.UTF8.GetString(result.Buffer);
// here we parse the response...
}
}
}
Здесь udpClient.ReceiveAsync никогда не возвращается, пока не истечет время ожидания.
Использование простого сокета:

Код: Выделить всё

IPEndPoint localEndPoint = new(IPAddress.Any, 0);
IPEndPoint ssdpEndPoint = new(IPAddress.Parse("239.255.255.250"), 1900);

using (Socket udpSocket = new(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpSocket.Bind(localEndPoint);
udpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ssdpEndPoint.Address, IPAddress.Any));

udpSocket.SendTo(Encoding.ASCII.GetBytes("M-SEARCH * HTTP/1.1\r\nHost: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\r\nST: ssdp:all\r\nMX: 3\r\n\r\n"), ssdpEndPoint);

byte[] buffer = new byte[4096];
DateTime thresholdTime = DateTime.UtcNow.Add(timeout);

while (thresholdTime > DateTime.UtcNow)
{
if (udpSocket.Available > 0)
{
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
int size = udpSocket.ReceiveFrom(buffer, ref remote);
// here we parse the response
}
}
}
В этом случае udpSocket.Available всегда равен 0 (ничего не получено).
Я могу неправильно понять, как здесь работает сетевая часть, поэтому некоторые вопросы:
Если доступных устройств нет, должен ли я получить хотя бы что-то вроде «пустого списка»? Чтобы udpClient.ReceiveAsync возвращался до того, как истечет таймаут, и в сокет поступило несколько байтов ответа.
Если такое устройство есть (на самом деле у меня есть хотя бы одно в моей локальной сети), что не так с запросами?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/797 ... -an-answer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»