diff --git a/packages/sockets/AbstractSocketImpl.st b/packages/sockets/AbstractSocketImpl.st index a71410e..096d0f2 100644 --- a/packages/sockets/AbstractSocketImpl.st +++ b/packages/sockets/AbstractSocketImpl.st @@ -647,12 +647,12 @@ implementations.'> to only peek for it without removing it from the queue." - | address port data from addrLen fd | + | address port data from addrLen fd read | data := ByteArray new: self bufferSize. from := ByteArray new: 128. addrLen := CInt gcValue: 128. (fd := self fd) isNil ifTrue: [ ^SystemExceptions.EndOfStream signal ]. - self + read := self receive: fd buffer: data size: data size @@ -662,6 +662,7 @@ implementations.'> port := ValueHolder new. ^aDatagram data: data; + dataSize: read; address: (SocketAddress fromSockAddr: from port: port); port: port value; yourself @@ -681,7 +682,7 @@ implementations.'> self send: fd buffer: aDatagram data - size: aDatagram data size + size: aDatagram payloadSize flags: self flags to: receiver size: size diff --git a/packages/sockets/Datagram.st b/packages/sockets/Datagram.st index 0793601..0e81ba3 100644 --- a/packages/sockets/Datagram.st +++ b/packages/sockets/Datagram.st @@ -32,7 +32,7 @@ Object subclass: Datagram [ - | data address port | + | data address port dataSize | "Set the data attached to the datagram" - data := aByteArray + data := aByteArray. + dataSize := nil. ] + dataSize [ + + + + ^dataSize + ] + + dataSize: aSize [ + + + + dataSize := aSize + ] + + payloadSize [ + + + dataSize isNil + ifTrue: [^data size] + ifFalse: [^dataSize] + ] + + get [ "Parse the data attached to the datagram through a newly created ObjectDumper, and answer the resulting object. This method is diff --git a/packages/sockets/Sockets.st b/packages/sockets/Sockets.st index a279c42..a1033ee 100644 --- a/packages/sockets/Sockets.st +++ b/packages/sockets/Sockets.st @@ -631,6 +631,20 @@ but it is done for cleanliness and symmetry.'> port: remotePort ] + DatagramSocket class >> addressFromString: ipAddressOrString [ + | addr | + + ipAddressOrString isString + ifTrue: [ + addr := SocketAddress byName: ipAddressOrString. + addr isNil + ifTrue: + [self error: 'cannot resolve host name ' , ipAddressOrString printString]] + ifFalse: [addr := ipAddressOrString]. + + ^ addr + ] + DatagramSocket class >> remote: ipAddressOrString port: remotePort local: ipAddress port: localPort [ "Create a new socket and bind it to the given host (passed as a String to be resolved or as a SocketAddress), and to the given remotePort. @@ -639,22 +653,16 @@ but it is done for cleanliness and symmetry.'> | localAddr remoteAddr addressClass | - ipAddressOrString isString - ifTrue: [ - remoteAddr := SocketAddress byName: ipAddressOrString. - remoteAddr isNil - ifTrue: - [self error: 'cannot resolve host name ' , ipAddressOrString printString]] - ifFalse: [remoteAddr := ipAddressOrString]. + remoteAddr := self addressFromString: ipAddressOrString. addressClass := remoteAddr isNil ifTrue: [self defaultAddressClass] ifFalse: [remoteAddr class]. - addressClass := ipAddress isNil + addressClass := (ipAddress isNil or: [ipAddress isString]) ifTrue: [addressClass] ifFalse: [ipAddress class]. - localAddr := ipAddress isNil - ifTrue: [addressClass anyLocalAddress] - ifFalse: [ipAddress]. + + localAddr := self addressFromString: ipAddress. + localAddr ifNil: [localAddr := addressClass anyLocalAddress]. ^(addressClass newSocket: self) remote: remoteAddr port: remotePort