2013-09-16 93 views
1

我是SSDP/UPNP/Sockets和所有爵士樂的新手。我正在玩這個遊戲,我只想看看在我的網絡上會發現一個普通的SSDP搜索。Windows Phone 8中的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); 
} 
+0

什麼是「不出現帶回任何結果」是什麼意思?你有錯誤嗎?並返回空緩衝區?別的東西? –

+0

沒有收到任何消息,因此socket.MessageReceived從不被觸發。 – earthling

回答

2

我不熟悉C#或DOTNET API的,但我可以看到一些細節錯誤的M-SEARCH消息:

  • MAN頭必須用雙引號,所以MAN: "ssdp:discover"\r\n
  • MX頭部丟失(用於多播)
  • 用戶代理頭缺少
  • 到底缺少一個空行
  • 個名稱是所謂不區分大小寫,但我會用大寫以防萬一...

Device Architecture reference pdf更多細節

+0

我曾在MAN頭中用雙引號試過它。我有MX頭在那裏(不知道爲什麼我沒有在這篇文章中)。我以前曾嘗試製作所有標題名稱大寫。最終解決問題的是空線。哇! – earthling