Пиша приложение за Windows Store/Metro/Modern/RT за Windows 8/RT, което трябва да получава UDP пакети на порт 49030, но изглежда не мога да получа никакви пакети. Следвах урока за използване на DatagramSocket
до буквата и не получавам нищо. Знам, че моята изпращаща програма изпраща данни, както мога да го видя в wireshark. Написах и тестово C# конзолно приложение, което използва обикновения API за BSD сокет (System.Net.Sockets.Socket), който правилно получава данните през UDP.
Това е кодът, който работи:
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.Bind(new IPEndPoint(IPAddress.Any, 49030));
byte[] buf = new byte[5000];
while (true)
{
Console.WriteLine("Received " + s.Receive(buf) + " bytes.");
}
Това извежда редове, които отчитат броя байтове, които се изпращат, както се очаква.
Моят код за приложението RT:
public async void StartListening()
{
DatagramSocket s = new DatagramSocket();
s.MessageReceived += s_MessageReceived;
await s.BindServiceNameAsync(this._port.ToString());
}
void s_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("Hark! A packet!"); // Breakpoint here
}
След извикване на StartListening()
, точката на прекъсване никога не се достига и нищо не се отпечатва в изходния журнал.
Опитах се да стартирам пробата DatagramSocket, предлагана от MSFT, и тя не работи без проблем (разбира се). Виждам, че сокетът е се отваря/прослушва, защото се показва в resmon.exe. Освен това имам активирани всички подходящи възможности в манифеста за приложението. Тествах го на моя лаптоп x86 и на моя Surface RT (дистанционно отстраняване на грешки) и и двата показват същото поведение.
Някакви идеи защо не работи?
socket.Bind
изглежда не работи и трябва да използвате различен метод: stackoverflow.com/questions/10290945/ - person Sam Axe   schedule 07.03.2013s.Bind(new IPEndpoint(IPAddress.Any, port))
). Има ли начин да направите това с ConnectAsync()? - person Matthew Kennedy   schedule 07.03.2013