15

UPnP マルチキャスト (Visual C# 2010 Express、Windows 7 Professional 64 ビットで実行) をテストする小さなプログラムを作成しました。ネットワーク内の UPnP デバイスから UPnP NOTIFY メッセージを受信できます。しかし、M-SEARCH メッセージを送信しても応答がありません。

iOS 環境 (Mac 上の iPhone シミュレーターで実行される iOS 用モノタッチ) で同じコードをテストしました。そこでは正常に動作し、UPnP デバイスからすべての検索応答を取得します。Windows プログラムから M-SEARCH メッセージも表示されます。

Windows (またはファイアウォール?) が検索応答を隠しているようです。何か案が?

コードは次のとおりです。

IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 1900);
IPEndPoint MulticastEndPoint = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);

Socket UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

UdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
UdpSocket.Bind(LocalEndPoint);
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(MulticastEndPoint.Address, IPAddress.Any));
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2);
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);

Console.WriteLine("UDP-Socket setup done...\r\n");

string SearchString = "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";

UdpSocket.SendTo(Encoding.UTF8.GetBytes(SearchString), SocketFlags.None, MulticastEndPoint);

Console.WriteLine("M-Search sent...\r\n");

byte[] ReceiveBuffer = new byte[64000];

int ReceivedBytes = 0;

while (true)
{
    if (UdpSocket.Available > 0)
    {
        ReceivedBytes = UdpSocket.Receive(ReceiveBuffer, SocketFlags.None);

        if (ReceivedBytes > 0)
        {
            Console.WriteLine(Encoding.UTF8.GetString(ReceiveBuffer, 0, ReceivedBytes));
        }
    }
}
4

3 に答える 3

19

ええ、私は問題を解決しました!小さな間違い、大きな影響:

私のプログラムは、UPnPマルチキャストグループにバインドされているポート1900でM-SEARCHを送信しています。LocalEndPointを同じポートにバインドしたため、UPnPデバイスはユニキャストでポート1900に応答します。iOSでは、私のプログラムがこのポートにバインドされた唯一のサービスであったため、機能しました。しかし、PCで、ポート1900にバインドされたいくつかのサービスを見つけました(「netstat-pUDP-a」で見つかりました)。そのため、UPnPデバイスからのユニキャストメッセージは他のサービスの1つに吸収されました。

解決策:LocalEndPointを空きポート(60000など)にバインドしましたが、正常に動作するようになりました。

IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 60000);
于 2012-10-10T08:46:54.900 に答える