加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – UPnP组播:M-SEARCH(发现)中缺少答案

发布时间:2020-12-15 03:45:43 所属栏目:百科 来源:网络整理
导读:我创建了一个小程序来测试UPnP Multicast(Visual C#2010 Express,在 Windows 7 Professional 64位上运行).我可以从网络上的UPnP设备收到UPnP NOTIFY消息.但是当我发送M-SEARCH消息时,我得不到答案. 我已经在iOS环境中测试了相同的代码(在Mac上使用的是iPhone
我创建了一个小程序来测试UPnP Multicast(Visual C#2010 Express,在 Windows 7 Professional 64位上运行).我可以从网络上的UPnP设备收到UPnP NOTIFY消息.但是当我发送M-SEARCH消息时,我得不到答案.

我已经在iOS环境中测试了相同的代码(在Mac上使用的是iPhone的iPhone模拟器上的Monotouch).它运行正常,我得到我的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...rn");

string SearchString = "M-SEARCH * HTTP/1.1rnHOST:239.255.255.250:1900rnMAN:"ssdp:discover"rnST:ssdp:allrnMX:3rnrn";

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

Console.WriteLine("M-Search sent...rn");

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,ReceivedBytes));
        }
    }
}

解决方法

是的,我解决了这个问题!小错误,大影响:

我的程序正在发送绑定到UPnP组播组的端口1900上的M-SEARCH.因为我将LocalEndPoint绑定到同一个端口,所以UPnP设备以单播方式回答到端口1900.在iOS上它是有效的,因为我的程序是绑定到此端口的唯一服务.但是在PC上,我发现几个服务绑定到端口1900(发现与“netstat -p UDP -a”).因此,UPnP设备的单播消息被其他服务所吸收.

解决方案:我将LocalEndPoint绑定到一个免费的端口(例如60000),现在它工作正常了!

IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any,60000);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读