У меня есть следующий код, который отправляет многоадресное сообщение, а затем ожидает ответа на адрес, с которого пришло сообщение. Если я наблюдаю за трафиком в Wireshark, я вижу, что сообщение отправляется нормально, и ответ возвращается на правильный IP-адрес и порт, однако сокет никогда не возвращается из линии приема, как будто ответ не принимается.
var multicastAddress = IPAddress.Parse("239.255.255.250");
var multicastPort = 1900;
var unicastPort = 1901;
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
{
socket.Bind(new IPEndPoint(IPAddress.Any, unicastPort));
socket.Connect(new IPEndPoint(multicastAddress, multicastPort));
var thd = new Thread(() =>
{
try
{
while (true)
{
var response = new byte[8000];
EndPoint ep = new IPEndPoint(IPAddress.Any, unicastPort);
socket.ReceiveFrom(response, ref ep);
var str = Encoding.UTF8.GetString(response);
Devices.Add(new SsdpDevice() {Location = str});
}
}
catch
{
//TODO handle exception for when connection closes
}
});
socket.Send(broadcastMessage, 0, broadcastMessage.Length, SocketFlags.None);
thd.Start();
Thread.Sleep(30000);
socket.Close();
}
Я знаю, что должен использовать асинхронные методы в классе сокетов и должен прекратить полагаться на Thread.Sleep, но я просто хочу получить простой пример работы, прежде чем привести в порядок код.