A bit of archeology. I could not find message sends quickly in
https://github.com/NikolaySuslov/croquet-squeak and in 5.2 squeak image.
Code by Johh MacIntosh of 2000 in squeak 5.2  is below, for the
primitiveOnlySupportsOneSemaphore=true it relies on #setPeer:port which in
turn does a linux syscall to connect(2)  restricting socket to send/receive
only to/from a single peer.
in 2011 it was changed by 'ul' (I don't know whom the initials belong to)
setPeer:port was dropped and this is how it stays since then both in squeak
and pharo - purely image side logic to filter incoming datagrams.

= JMM =
receiveDataInto: aStringOrByteArray fromHost: hostAddress port: portNumber
| datagram |
"Receive a UDP packet from the given hostAddress/portNumber, storing the
data in the given buffer, and return the number of bytes received. Note the
given buffer may be only partially filled by the received data."

primitiveOnlySupportsOneSemaphore ifTrue:
[self setPeer: hostAddress port: portNumber.
^self receiveDataInto: aStringOrByteArray].
[true] whileTrue:
[datagram := self receiveUDPDataInto: aStringOrByteArray.
((datagram at: 2) = hostAddress and: [(datagram at: 3) = portNumber])
ifTrue: [^datagram at: 1]
ifFalse: [^0]]


= ul =
receiveDataInto: aStringOrByteArray fromHost: hostAddress port: portNumber
| datagram |
"Receive a UDP packet from the given hostAddress/portNumber, storing the
data in the given buffer, and return the number of bytes received. Note the
given buffer may be only partially filled by the received data."

[
datagram := self receiveUDPDataInto: aStringOrByteArray.
((datagram at: 2) = hostAddress and: [(datagram at: 3) = portNumber])
ifTrue: [^datagram at: 1]
ifFalse: [^0]] repeat

вс, 26 янв. 2020 г. в 13:14, Danil Osipchuk <[email protected]>:

> As soon as you start listening on udp port every host having connectivity
> will be able to send you a datagram which will hit a smalltalk handler. It
> is a concern both from performance and security pov. You may be willing to
> implement your  own protocol suit on top of udp to have a tcp like endpoint
> pairing and session managment, but without buffering/windowing and reliable
> transmission to meet realtime requirements of gaming etc. For that you will
> need this.
> Probably it was used by multiuser collaboration project croquet
>
> https://en.m.wikipedia.org/wiki/Croquet_Proje
> Regards
> Danil
>
> вс, 26 янв. 2020 г., 12:08 Sven Van Caekenberghe <[email protected]>:
>
>>
>>
>> > On 26 Jan 2020, at 09:42, HilaireFernandes <[email protected]> wrote:
>> >
>> > Sven Van Caekenberghe wrote
>> >> Sounds nice, and indeed a (more) fun way to teach programming.
>> >>
>> >> But I still fail to see why you have to filter incoming UDP packets on
>> >> their origin address.
>> >
>> > If third party software on the workstation are connected to other
>> network
>> > services, don't you want to filter out? Or am I missing something?
>>
>> I think so: you listen on an UDP socket on a specific port (and
>> optionally bound to a specific network interface on your machine), then you
>> get only datagrams directed to you - this happens at the OS level.
>>
>> A (at host:port) sends a datagram to B (at host:port), to reply, B looks
>> at the datagram to figure out the sender's info and replies.
>>
>> You can study the example UDPSocketEchoTest to see how this works.
>>
>> HTH,
>>
>> Sven
>>
>>
>>
>>

Reply via email to