I'm not an expert on networking stuff, but I'll try (and if I'm wrong I'll learn something new)...

Holger Hans Peter Freyther wrote:

Classic ReadStream in Pharo3.0

#[] readStream next: 2   => #[]


SocketStream:

1.) Start something that listens to 12345
$ nc -l -p 12345

2.) In Pharo do

 | conn |
 conn := (SocketStream openConnectionToHostNamed: 'localhost' port: 12345)
            binary;
            noTimeout;
            yourself.
 [
   (conn next: 4) inspect.
 ] on: ConnectionClosed do: [:e | "Never called" self halt ].

3.) CTRL+C the netcat process..
4.) In Pharo an inspector on an ByteArray is coming up. The
ConnectionClosed signal is raised but swallowed by the
SocketStream code.




I don't know how realistic it is but I would appreciate if

1.) #[] readStream next: 4. Could raise an Error that one can
not consume four bytes/elements.

Making it an Error seems a somewhat fundamental change that could break other people's code. Would a Notification be sufficient?
2.) I understand that not raising "ConnectionClosed" is to allow
a partial read from the socket. What is done in GNU Smalltalk is
to at least signal an EndOfStream notificaton. So the socket code
could read like:

Are you implying that in the same situation GNU Smalltalk similarly does not raise ConnectionClosed, but raises EndOfStream instead? EndOfStream as a Notification seems a low impact addition that would be generally useful. Can you determine the code changes required for SocketStream? The fastest way to get what you need is to open a ticket at pharo.fogbugz.com, then also supply the required code** as a slice :). This will provide something concrete to review. **Including tests, one test that catches your new Notification, and then a duplicate of that test that does not catch the Notification, which works the same before and after slice is applied.

cheers -ben

 | conn |
 conn := (SocketStream openConnectionToHostNamed: 'localhost' port: 12345)
            binary;
            noTimeout;
            yourself.
 [
   (conn next: 4) inspect.
 ] on: EndOfStream do: [:e | self handleClosing ].




is this more clear?

        holger




Reply via email to