Windows Phone 8中的SSDP搜索

我是SSDP / UPNP / Sockets和所有爵士乐的新手。 我正在玩它一点,我只想看看我的网络上的通用SSDP搜索会带来什么。

使用这个SSDP Sniffer应用程序,我得到了很多结果,所以我试图重新创建它。

我正在使用以下代码,我发现了各种版本,但我做的所有调整似乎都没有带来任何结果。 我在这里几乎不知所措,并希望得到任何指导。

谢谢!

private const string SSDP_IP = "239.255.255.250"; private const string SSDP_PORT = "1900"; private const string SSDP_QUERY = "M-SEARCH * HTTP/1.1\r\n" + "Host: " + SSDP_IP + ":" + SSDP_PORT + "\r\n" + "Man: ssdp:discover\r\n" + "ST: ssdp:all\r\n"; DataGramSocket socket; async public void SsdpQueryAsync() { var remoteIP = new Windows.Networking.HostName(SSDP_IP); var reqBuff = Encoding.UTF8.GetBytes(SSDP_QUERY); socket = new DatagramSocket(); socket.MessageReceived += (sender, args) => { // This is invoked for each device that responds to the query... Task.Run(() => { // do something useful }); }; await socket.BindEndpointAsync(null, ""); socket.JoinMulticastGroup(remoteIP); using (var stream = await socket.GetOutputStreamAsync(remoteIP, SSDP_PORT)) { await stream.WriteAsync(reqBuff.AsBuffer()); } await Task.Delay(5000); } 

我不熟悉C#或dotnet API,但我可以看到M-SEARCH消息的一些细节错误:

  • MAN标题必须用双引号括起来,所以MAN: "ssdp:discover"\r\n
  • 缺少MX标头(多播需要)
  • USER-AGENT标头丢失
  • 最后错过了一条空行
  • 标题名称应该不区分大小写,但我会使用大写以防万一…

有关更多详细信息,请参阅Device Architecture参考pdf