Мне нужно искать устройства UPNP в моей сети. Есть несколько примеров, но, используя 2 разных подхода, я никогда не получаю ответа.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...
}
}
< /code>
Здесь 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
}
}
< /code>
В этом случае udpsocket.available всегда 0 (ничего не получен). < /p>
Я могу неправильно понять, как здесь работает сетевая часть, так что некоторые вопросы: < /p>
Если нет доступных устройств, я должен получить как минимум что -то вроде «Пустого списка»? Так что udpclient.receiveasync возвращается до достижения тайм -аута, и есть некоторые ответные байты на сокет.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -an-answer
SSDP Devices Discovery Discovery: Никогда не получайте ответа ⇐ C#
Место общения программистов C#
-
Anonymous
1753344423
Anonymous
Мне нужно искать устройства UPNP в моей сети. Есть несколько примеров, но, используя 2 разных подхода, я никогда не получаю ответа.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...
}
}
< /code>
Здесь 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
}
}
< /code>
В этом случае udpsocket.available всегда 0 (ничего не получен). < /p>
Я могу неправильно понять, как здесь работает сетевая часть, так что некоторые вопросы: < /p>
Если нет доступных устройств, я должен получить как минимум что -то вроде «Пустого списка»? Так что udpclient.receiveasync возвращается до достижения тайм -аута, и есть некоторые ответные байты на сокет.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79712979/ssdp-devices-network-discovery-never-receive-an-answer[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия