Win8:DatagramSocket.send到多播addr默默地失败

时间:2015-06-14 11:48:19

标签: java udp multicast upnp ssdp

我正在尝试为某个支持UPnP的电视编写一个非常简单的SSDP发现例程。这是我的代码的简化版本:

private void discover() {

String header = "M-SEARCH * HTTP/1.1";
String[][] fields = new String[][] {
        {"ST", "ssdp:all"},
        {"MAN", "\"ssdp:discover\""},
        {"HOST", "239.255.255.250:1900"},
        {"MX", "10"}};

String p=this.make_packet(header, fields);

MulticastSocket s = null;
ArrayList<String> devices=new ArrayList<String>();
String[] ret;
String[] loc;

try {
    InetAddress addr=InetAddress.getByName("239.255.255.250");
    s = new MulticastSocket(1900);
    s.setReuseAddress(true);
    s.setSoTimeout(3000);
    s.joinGroup(addr);

    DatagramPacket pack=new DatagramPacket(p.getBytes("UTF-8"), p.length(), addr, 1900);
    s.send(pack);

    byte[] buffer=new byte[1024];

    DatagramPacket packrec=new DatagramPacket(buffer, 1024);

    for(;;) {
        System.out.println("Waiting for response...");
        s.receive(packrec);
        System.out.println(new String(buffer, 0, packrec.getLength()));
    }

} catch (Exception e) {
    System.out.println(e);
}

}

我通过控制台在Win8机器上编译并运行代码。套接字始终只收到一个响应:要发送的消息的1:1副本。我想这可能是正确的,因为套接字在开始时加入了多播组。但是,没有其他UPnP设备回复,尽管我可以在第三方UPnP检查员中看到它们。

使用WireShark观看网络流量时,我的代码似乎根本没有发送任何包,尽管没有抛出任何异常。当使用来自同一台机器的不同UPnP检查器扫描网络时,WireShark会记录出站包(尽管奇怪的是,某些设备的回复不是,即使检查员发现它们)。

我现在四天乱搞这个,但无济于事。有什么想法吗?

谢谢, 埃里克

P.S。:JDK 1.8.0_45(64位)

0 个答案:

没有答案