>From b531e7d40a0453e9cdad3b2e6d5aed80f09fef19 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 12 Jun 2010 11:52:36 +0800 Subject: [PATCH 1/3] UDP: Make it possible to find out how many bytes were received This makes it possible to see the number of bytes received by the recvfrom call and such a Datagram can be send using the #nextPut: selector. 2010-06-12 Holger Hans Peter Freyther * Datagram.st: Add #dataSize, #dataSize: and #size. * AbstractSocketImpl.st: Call Datagram>>#dataSize: from the #receive:datagram selector with the bytes read, use Datagram>>#size in the #send:to:port selector to only send a limited amount of bytes from the Datagram>>#data. --- packages/sockets/AbstractSocketImpl.st | 7 +++-- packages/sockets/ChangeLog | 8 +++++++ packages/sockets/Datagram.st | 36 ++++++++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/packages/sockets/AbstractSocketImpl.st b/packages/sockets/AbstractSocketImpl.st index a71410e..0e5d8ce 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 size flags: self flags to: receiver size: size diff --git a/packages/sockets/ChangeLog b/packages/sockets/ChangeLog index 4ed3aba..a6ac75e 100644 --- a/packages/sockets/ChangeLog +++ b/packages/sockets/ChangeLog @@ -1,3 +1,11 @@ +2010-06-12 Holger Hans Peter Freyther + + * Datagram.st: Add #dataSize, #dataSize: and #size. + * AbstractSocketImpl.st: Call Datagram>>#dataSize: from the + #receive:datagram selector with the bytes read, use + Datagram>>#size in the #send:to:port selector to only send + a limited amount of bytes from the Datagram>>#data. + 2010-03-27 Paolo Bonzini * AbstractSocketImpl.st: Do not check errno unless a system call diff --git a/packages/sockets/Datagram.st b/packages/sockets/Datagram.st index 0793601..a5a3126 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 [ + "Answer the size of the message." + + + + ^dataSize + ] + + dataSize: aSize [ + "I am called to update the size..." + + + + dataSize := aSize + ] + + size [ + "I determine the size of the datagram. It is either the specified dataSize or + data size." + + + | result | + + result := dataSize isNil + ifTrue: [data size] + ifFalse: [dataSize]. + + ^ result + ] + + get [ "Parse the data attached to the datagram through a newly created ObjectDumper, and answer the resulting object. This method is -- 1.7.0.1