> On 18 May 2015, at 12:44, Manfred Kröhnert <mkroehner...@googlemail.com> 
> wrote:
> 
> Hello Sven,
> 
> thanks for your fast reply.
> 
> On Mon, May 18, 2015 at 11:41 AM, Sven Van Caekenberghe <s...@stfx.eu> wrote:
> Hi Manfred,
> 
> Did you see/study the example/test UDPSocketEchoTest ?
> 
> unfortunately I did not see this class, yet.
> But I did look at the Socket class itself and Socket>>timeTestUDP (in Pharo3).

We removed #timeTestUDP in Pharo 4 and higher, I believe, and replaced it with 
proper tests/examples.

> Also, UDP is very primitive: it is send and forget, returns no errors, and is 
> totally asynchronous. Listening should best be done in a separate process.
> 
> Yes, UDP is primitive but the SSDP specification requires using UDP.
> 
> Here is how I would write your send part:
> 
>  | message udpSocket |
>   message := String crlf join: #(
>    'M-SEARCH * HTTP/1.1'
>    'HOST:239.255.255.250:1900'
>    'MAN:"ssdp:discover'
>    'ST:ssdp:all'
>    'MX:1'
>    '').
> 
>   udpSocket := Socket newUDP.
>   udpSocket sendData: message toHost: #[239 255 255 250] port: 1900.
>   udpSocket waitForSendDoneFor: 5.
>   udpSocket closeAndDestroy.
> 
> Thanks for this snippet.
> For some reasons I do not understand yet, this gives me the expected result 
> in contrast to my own version.
> 
> I modified it like this to print the results on the Transcript:
> 
> | message udpSocket |
>   message := String crlf join: #(
>    'M-SEARCH * HTTP/1.1'
>    'HOST:239.255.255.250:1900'
>    'MAN:"ssdp:discover"'
>    'ST:ssdp:all'
>    'MX:1'
>    '').
> 
>   udpSocket := Socket newUDP.
>   udpSocket sendData: message toHost: #[239 255 255 250] port: 1900.
>   udpSocket waitForSendDoneFor: 5.
>   udpSocket waitForData.
>   [udpSocket dataAvailable ] whileTrue: [ | buffer |
>     buffer := ByteArray new: 1024.
>     udpSocket receiveUDPDataInto: buffer.
>     Transcript show: 'Received: ', buffer.
>     [udpSocket waitForDataFor: 1] on: Error do: [  ].
>   ].
>   udpSocket closeAndDestroy.
> 
> Currently, this will work for me, since I am not interested in continuously 
> detecting new devices.
> But you mentioned reading should in general be done in a separate process.
> Would you reuse the existing udpSocket instance in this case or create a 
> separate one for reading?

I think if it is only for a one time use, it is OK like you are doing it.

> Maybe nothing came back because the line ends where wrong ?
> 
> The lineendings I used are required by the SSDP specification.

I meant that writing '\r\n' has no effect in Pharo, this is not processed (you 
could do this manually, of course). This is why I did it with the #join:

That is the difference and why it works now, I guess.

> HTH,
> 
> Sven
> 
> Thanks,
> Manfred
>  
> > On 18 May 2015, at 11:29, Manfred Kröhnert <mkroehner...@googlemail.com> 
> > wrote:
> >
> > 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