Socket plugin signature - Urgent

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Socket plugin signature - Urgent

Annick
Hi,

Is it possible to get the documentation of the socket api signature, because otherwise I am unable to setup a UDP server ?

Annick
Reply | Threaded
Open this post in threaded view
|

Re: Socket plugin signature - Urgent

Sven Van Caekenberghe-2
I don't understand why you would need it, see my previous reply to your other message.

> On 20 Oct 2014, at 17:23, Annick Fron <[hidden email]> wrote:
>
> Hi,
>
> Is it possible to get the documentation of the socket api signature, because otherwise I am unable to setup a UDP server ?
>
> Annick


Reply | Threaded
Open this post in threaded view
|

Re: Socket plugin signature - Urgent

Annick
In your answer you mention 1 2 3 4 data, without specifying how many bytes they have.
Typically the IP address needs 4 bytes, so your answer 1 2 3 4 is quite incomplete.
When I receive data like that

[28 0 203 204 …….]

I don’t know if I have only the datagram or if I have also the IP header.
So my question is how do you group the bytes to get the IP address ???
Where do the data start ? What headers do I have and with which syntax ????

Annick


Le 20 oct. 2014 à 17:32, Sven Van Caekenberghe <[hidden email]> a écrit :

> I don't understand why you would need it, see my previous reply to your other message.
>
>> On 20 Oct 2014, at 17:23, Annick Fron <[hidden email]> wrote:
>>
>> Hi,
>>
>> Is it possible to get the documentation of the socket api signature, because otherwise I am unable to setup a UDP server ?
>>
>> Annick
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Socket plugin signature - Urgent

Sven Van Caekenberghe-2
Again, Pharo is a high-level language, not a low-level one.

Here is a working, standalone example:

"An UDP echo server on port 6666"
[ Socket newUDP in: [ :socket |
  | loop buffer result input |
  buffer := String new: 256.
  loop := true.
  socket setPort: 6666.
  [ loop ] whileTrue: [
    [ result := socket receiveUDPDataInto: buffer.
      result first > 0 ] whileFalse: [ (Delay forMilliseconds: 10) wait ].
    input := buffer copyFrom: 1 to: result first.
    socket sendUDPData: input toHost: result second port: result third.
    (input beginsWith: #quit) ifTrue: [ loop := false ] ].
    socket closeAndDestroy ] ] forkAt: Processor userBackgroundPriority named: 'UDP echo server'.

"Any message sent gets echoed back"
Socket newUDP in: [ :socket |
  | buffer result |
  socket sendUDPData: 'testing ', 99 atRandom asString toHost: NetNameResolver localHostAddress port: 6666.
  buffer := String new: 256.
  [ result := socket receiveUDPDataInto: buffer.
    result first > 0 ] whileFalse: [ (Delay forMilliseconds: 10) wait ].
  socket closeAndDestroy.
  { result. buffer. buffer copyFrom: 1 to: result first } ].

"Send quit to stop the server"
Socket newUDP in: [ :socket |
  | buffer result |
  socket sendUDPData: 'quit' toHost: NetNameResolver localHostAddress port: 6666.
  buffer := String new: 256.
  [ result := socket receiveUDPDataInto: buffer.
    result first > 0 ] whileFalse: [ (Delay forMilliseconds: 10) wait ].
  socket closeAndDestroy.
  { result. buffer. buffer copyFrom: 1 to: result first } ].

In a terminal (OSX or Linux), you can send a message like this:

$ nc -u 127.0.0.1 6666
foo bar
foo bar
quit
quit

HTH,

Sven

> On 20 Oct 2014, at 22:39, Annick Fron <[hidden email]> wrote:
>
> In your answer you mention 1 2 3 4 data, without specifying how many bytes they have.
> Typically the IP address needs 4 bytes, so your answer 1 2 3 4 is quite incomplete.
> When I receive data like that
>
> [28 0 203 204 …….]
>
> I don’t know if I have only the datagram or if I have also the IP header.
> So my question is how do you group the bytes to get the IP address ???
> Where do the data start ? What headers do I have and with which syntax ????
>
> Annick
>
>
> Le 20 oct. 2014 à 17:32, Sven Van Caekenberghe <[hidden email]> a écrit :
>
>> I don't understand why you would need it, see my previous reply to your other message.
>>
>>> On 20 Oct 2014, at 17:23, Annick Fron <[hidden email]> wrote:
>>>
>>> Hi,
>>>
>>> Is it possible to get the documentation of the socket api signature, because otherwise I am unable to setup a UDP server ?
>>>
>>> Annick
>>
>>
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Socket plugin signature - Urgent

stepharo
Thanks sven

I will check with the guys that wrote the socket chapter if we can add
this snippet.

Stef

On 20/10/14 23:44, Sven Van Caekenberghe wrote:

> Again, Pharo is a high-level language, not a low-level one.
>
> Here is a working, standalone example:
>
> "An UDP echo server on port 6666"
> [ Socket newUDP in: [ :socket |
>    | loop buffer result input |
>    buffer := String new: 256.
>    loop := true.
>    socket setPort: 6666.
>    [ loop ] whileTrue: [
>      [ result := socket receiveUDPDataInto: buffer.
>        result first > 0 ] whileFalse: [ (Delay forMilliseconds: 10) wait ].
>      input := buffer copyFrom: 1 to: result first.
>      socket sendUDPData: input toHost: result second port: result third.
>      (input beginsWith: #quit) ifTrue: [ loop := false ] ].
>      socket closeAndDestroy ] ] forkAt: Processor userBackgroundPriority named: 'UDP echo server'.
>
> "Any message sent gets echoed back"
> Socket newUDP in: [ :socket |
>    | buffer result |
>    socket sendUDPData: 'testing ', 99 atRandom asString toHost: NetNameResolver localHostAddress port: 6666.
>    buffer := String new: 256.
>    [ result := socket receiveUDPDataInto: buffer.
>      result first > 0 ] whileFalse: [ (Delay forMilliseconds: 10) wait ].
>    socket closeAndDestroy.
>    { result. buffer. buffer copyFrom: 1 to: result first } ].
>
> "Send quit to stop the server"
> Socket newUDP in: [ :socket |
>    | buffer result |
>    socket sendUDPData: 'quit' toHost: NetNameResolver localHostAddress port: 6666.
>    buffer := String new: 256.
>    [ result := socket receiveUDPDataInto: buffer.
>      result first > 0 ] whileFalse: [ (Delay forMilliseconds: 10) wait ].
>    socket closeAndDestroy.
>    { result. buffer. buffer copyFrom: 1 to: result first } ].
>
> In a terminal (OSX or Linux), you can send a message like this:
>
> $ nc -u 127.0.0.1 6666
> foo bar
> foo bar
> quit
> quit
>
> HTH,
>
> Sven
>
>> On 20 Oct 2014, at 22:39, Annick Fron <[hidden email]> wrote:
>>
>> In your answer you mention 1 2 3 4 data, without specifying how many bytes they have.
>> Typically the IP address needs 4 bytes, so your answer 1 2 3 4 is quite incomplete.
>> When I receive data like that
>>
>> [28 0 203 204 …….]
>>
>> I don’t know if I have only the datagram or if I have also the IP header.
>> So my question is how do you group the bytes to get the IP address ???
>> Where do the data start ? What headers do I have and with which syntax ????
>>
>> Annick
>>
>>
>> Le 20 oct. 2014 à 17:32, Sven Van Caekenberghe <[hidden email]> a écrit :
>>
>>> I don't understand why you would need it, see my previous reply to your other message.
>>>
>>>> On 20 Oct 2014, at 17:23, Annick Fron <[hidden email]> wrote:
>>>>
>>>> Hi,
>>>>
>>>> Is it possible to get the documentation of the socket api signature, because otherwise I am unable to setup a UDP server ?
>>>>
>>>> Annick
>>>
>>
>
>