> On 19 May 2015, at 10:30, Udo Schneider <udo.schnei...@homeaddress.de> wrote:
> 
> Hi Sven,
> 
> you got me :-)
> 
> I had this as a package sometime ago for my own purposes (mDNS). So I knew it 
> does work and how to do it. It's just I can't find that damned package 
> anymore...

Did you look in all your package caches ?

> > I do think making all this cross platform could be a bit harder, we'll see.
> It's not that hard. The socket API is the same on all supported platforms. No 
> surprises on *nix based OS. The only exception is Windows where the API is 
> the same but where you might run into some packet drops due to strange 
> personal FW products and "value-add" NDIS drivers for NICs. The situation has 
> gotten much better though since Windows Vista/7 are using multicast for some 
> of their services out of the box.
> 
> I will recreate it though. Should I simply publish a package or add this as a 
> slice?

Thanks a lot, Udo, a good multicast example would be super cool.

If it is just a small example, like one class, maybe it could be added to the 
image, in which case it should indeed be a slice.

If it is larger and more application/framework oriented, then maybe a 
standalone package is more interesting. We try to keep the image as modular as 
possible. This route would be a bit more work for you, but might make more 
sense if you also see it possibly growing in the future.

> Best Regards,
> 
> Udo
> 
> 
> On 19/05/15 10:20, Sven Van Caekenberghe wrote:
>> Hi Udo,
>> 
>> It would be good if some of this knowledge could be added inside the image, 
>> as class comment or methods comments. Even better would be an example 
>> combined with a unit test, like UDPSocketEchoTest and TCPSocketEchoTest - 
>> the unit test would then actively ensure this functionality is protected.
>> 
>> I do think making all this cross platform could be a bit harder, we'll see.
>> 
>> Sven
>> 
>>> On 19 May 2015, at 00:17, Udo Schneider <udo.schnei...@homeaddress.de> 
>>> wrote:
>>> 
>>> This should have been 'IP_ADD_MEMBERSHIP' of course:
>>> 
>>> imrMultiaddr := #[239 255 255 250].
>>> imrInterface := #[0 0 0 0].
>>> ipMreq := imrMultiaddr , imrInterface.
>>> socket setOption: 'IP_ADD_MEMBERSHIP' value: ipMreq.
>>> 
>>> 
>>> The "server" could be something like this (execute in first playground). I 
>>> used another IP address (#[239 255 255 251]) because #[239 255 255 250] 
>>> might already be part of the multicast group because of other processes and 
>>> this shows the "whole" process of subscribing to a multicast group:
>>> 
>>> [
>>> |  udpSocket |
>>>  udpSocket := Socket newUDP.
>>>  udpSocket setPort: 1900.
>>>  imrMultiaddr := #[239 255 255 251].
>>>  imrInterface := #[0 0 0 0].
>>>  ipMreq := imrMultiaddr , imrInterface.
>>>  udpSocket setOption: 'IP_ADD_MEMBERSHIP' value: ipMreq.
>>>  udpSocket setOption: 'IP_MULTICAST_LOOP' value: 1.
>>>  "udpSocket setOption: 'SO_REUSEADDR' value: 1."
>>>  udpSocket waitForData.
>>>  buffer := ByteArray new: 256.
>>>  data := udpSocket receiveUDPDataInto: buffer.
>>>  bytesRead := data at: 1.
>>>  sender := data at: 2.
>>>  senderPort := data at: 3.
>>>  more := data at: 4.
>>>  result := buffer copyFrom: 1 to: bytesRead.
>>>  udpSocket closeAndDestroy.
>>>  result asString inspect.
>>> ] fork.
>>> 
>>> 
>>> 
>>> The "client" (execute in different playground):
>>> | 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 251] port: 1900.
>>>  (udpSocket waitForSendDoneFor: 5).
>>>  udpSocket closeAndDestroy.
>>> 
>>> Hope this helps.
>>> 
>>> CU,
>>> 
>>> Udo
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> On 18/05/15 23:29, Udo Schneider wrote:
>>>> Hi Manfred,
>>>> 
>>>> I just stumbled over the IP address you are using (239.255.255.250). If
>>>> I remember correctly this is a IPv4 Class D Multicast address.
>>>> (224.0.0.0-239.255.255.255).
>>>> 
>>>> So if you want to transmit datagrams to this IP address or recieve
>>>> datagrams sent to this multicast groups you have to set appropriate IP
>>>> Options.
>>>> 
>>>> You can set this options using Socket>>#setOption:value: and read them
>>>> using Socket>>#getOption:. Please note that both methods expect the
>>>> option to set as a name - not as constant. E.g.
>>>> 
>>>> socket setOption: 'IP_MULTICAST_IF' value: multicastInterface.
>>>> 
>>>> If I do remember correctly you have to set the following options for
>>>> sending/receiving:
>>>> 
>>>> Sending:
>>>> IP_MULTICAST_IF
>>>> (IP_MULTICAST_LOOP)
>>>> (IP_MULTICAST_TTL)
>>>> 
>>>> Sending should AFAIK work w/o setting any option - although
>>>> IP_MULTICAST_IF is highly recommended.
>>>> 
>>>> Receiving:
>>>> (SO_REUSEADDR)
>>>> IP_ADD_MEMBERSHIP
>>>> (IP_DROP_MEMBERSHIP)
>>>> 
>>>> Receiving only works if you joined the multicast group previously. So I
>>>> assume that you need to do something like this (not tested).
>>>> 
>>>> imrMultiaddr := #[239 255 255 250].
>>>> imrInterface := #[0 0 0 0].
>>>> ipMreq := imrMultiaddr , imrInterface.
>>>> socket setOption: 'MEMBERSHIP' value: ipMreq.
>>>> 
>>>> Hope this helps.
>>>> 
>>>> CU,
>>>> 
>>>> Udo
>>>> 
>>>> 
>>>> 
>>>> On 18/05/15 16:34, Manfred Kröhnert wrote:
>>>>> Hi Sven,
>>>>> 
>>>>> On Mon, May 18, 2015 at 4:14 PM, Sven Van Caekenberghe
>>>>> <s...@stfx.eu
>>>>> <mailto:s...@stfx.eu>> wrote:
>>>>> 
>>>>> 
>>>>>     > On 18 May 2015, at 15:47, Manfred Kröhnert
>>>>>    <mkroehner...@googlemail.com
>>>>>    <mailto:mkroehner...@googlemail.com>> wrote:
>>>>>     >
>>>>>     > Hi,
>>>>>     > apparently I am missing something else.
>>>>>     >
>>>>>     > I can find devices when connected to a 'regular' LAN.
>>>>>     >
>>>>>     > However, I have a camera that creates a Wifi accesspoint and
>>>>>    makes itself discoverable via SSDP.
>>>>>     > Once I connect to this accesspoint my computer gets a valid IP
>>>>>    address assigned and the NodeJS code is able to discover the device.
>>>>>     > Unfortunately, the Pharo snippet I posted before does not give me
>>>>>    any results and hangs in Socket>>waitForDataIfClosed: .
>>>>>     >
>>>>>     > Any further ideas?
>>>>> 
>>>>>    Are you sure you restarted the image and your code after switching
>>>>>    networks ?
>>>>> 
>>>>> 
>>>>> I did not check this before.
>>>>> But I just downloaded a fresh 40613 image with PharoLauncher and started
>>>>> it after connecting to the camera accesspoint.
>>>>> The code snippet freezes there as well.
>>>>> 
>>>>> Manfred
>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>> 
>> 
>> 
> 
> 
> 


Reply via email to