> On 20 Jan 2020, at 17:39, HilaireFernandes <[email protected]> wrote:
> 
> It is indeed about *receiveDataInto:fromHost:port:* I am talking about.
> 
> Its *fromHost* parameter is not of the same nature as the *toHost* parameter
> in the message *sendUDPData:toHost:port:  *
> In the former it is expected a ByteArray to work, in the later a
> SocketAdress.

I don't see any indication in the code to prove your statement 

"Socket>>#sendUDPData:toHost:port: is assuming hostAddress to be a 
SocketAddress".

Like I said, all primitives take host addresses to be a byte array (of which 
SocketAddress is a subclass).

> *About the context. 
> *This school year I am doing basic Pharo programming with Dr.Geo (12 and 13
> years old). I wrote a school book[1] for that. But It is a bit tedious to
> teach and not enough appealing. It may just be my fault or the format of the
> book. For the next semester, I will explore alternative format, in more
> independent teaching unit.
> 
> For the longer term, I want to explore alternative way of teaching Pharo,
> more appealing. Something more in the kids interest area. 
> 
> Do you know Minetest, it is a free implementation of Minecraft? It comes
> with a server software and client instances communicating with the server
> with a dedicated UDP protocol. In the past, we use it in an architecture
> project in connexion with math. 
> 
> Written with Pharo, I envision a Minetest client using the UPD protocol to
> interact with a server. This Pharo written client will be used as a
> programming environment to control the kid avatar in the Minetest 3D world,
> like a BotsInc of 3D. The Pharo client will not render the view, it will be
> done by the usual Minetest client.
> 
> For example, a kid could code the behaviour of his avatar to build a tower
> with a Minetest DSL:
> 
>    ../..
>    100 timesRepeat: [
>        avatar goUp
>        4 timesRepeat: [
>            10 timesRepeat: [avatar dropBrick; moveForward].
>            avatar turnLeft] ]
> 
> 
> There are some extensions in Minetest client (Mod in Minetest terminology)
> to do some basic programming but it is not as interesting as could be Pharo
> programming with a dedicated DSL[3].
> 
> I speculate it could be pretty cool and it should meet a lot of success
> among kids. Plus provide good teaching interest and more Pharo awareness.
> 
> Hilaire
> 
> [1]
> https://launchpad.net/drgeo/trunk/19.09/+download/programmer-avec-drgeo.pdf
> [2] http://www.minetest.net
> [3]
> https://forum.minetest.net/viewtopic.php?f=14&p=365620&sid=5d825763b9cb5579c5e195c0bf4e3b28#p365113

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.

I do agree that using ByteArray and SocketAddress interchanging fails in some 
cases, even though one is a subclass of the other, because #= fails, due to the 
class check.

I can't see an easy way to fix this (as #= is defined in 
SequenceableCollection). One solution might be to add #species ByteArray to 
SocketAddress, but it is hard to see the implications of that.

Another option might be to add:

SocketAddress>>#= anObject
  ^ self == anObject or: [ self hasEqualElements: anObject ]

This way, #= would work when the SocketAddress is the receiver (but not the 
other way around which is ugly).

If you then put hostAddress first in:

Socket>>#receiveDataInto: aStringOrByteArray fromHost: hostAddress port: 
portNumber
        "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 |
                datagram := self receiveUDPDataInto: aStringOrByteArray.
                (hostAddress = (datagram at: 2) and: [ (datagram at: 3) = 
portNumber ]) 
                        ifTrue: [ ^ datagram at: 1 ]
                        ifFalse: [ ^0 ] ] repeat

it should work.

Sven


Reply via email to