Hello everyone,

I am currently trying to get a list of UPnP device via SSDP (Simple Service
Discovery Protocol).

A minimalistic working NodeJS example looks like this:

    var dgram = require('dgram');
    var message = new Buffer(
        "M-SEARCH * HTTP/1.1\r\n" +
        "HOST:239.255.255.250:1900\r\n" +
        "MAN:\"ssdp:discover\"\r\n" +
        "ST:ssdp:all\r\n" +
        "MX:1\r\n" +
        "\r\n"
    );

    var client = dgram.createSocket("udp4");

    client.on("message", function (msg, rinfo) {
        console.log("server got: " + msg + " from " + rinfo.address + ":" +
rinfo.port);
    });
    client.send(message, 0, message.length, 1900, "239.255.255.250");
    client.close();

I tried to recreate the same functionality in Pharo with the following
piece of code:

  | message udpSocket host |
  message := 'M-SEARCH * HTTP/1.1\r\n' ,
    'HOST:239.255.255.250:1900\r\n' ,
    'MAN:"ssdp:discover"\r\n' ,
    'ST:ssdp:all\r\n' ,
    'MX:1\r\n' , '\r\n'.

  udpSocket := Socket newUDP.
  host :=  (NetNameResolver addressFromString: '239.255.255.250').
  udpSocket sendData: message toHost: host port: 1900.
  "udpSocket waitForData."
  Transcript show: 'Received: ' , udpSocket receiveData.
  udpSocket closeAndDestroy.

Unfortunately, this script hangs both in Pharo3 and Pharo4 (OS X 10.10,
Pharo 30856 and 40611).
When I interrupt with Cmd+. the debugger shows the method
    Socket>>waitForDataIfClosed:
and the hang is apparently in the line
    self readSemaphore wait

Could anyone give me some advice if I should to do this differently or what
the issue with the Pharo script is?

Thanks in advance,
Manfred

Reply via email to