Martin,
On 12 Jan 2011, at 19:13, [email protected] wrote:
> I started looking at the Socket failures that I can reproduce and I can't
> wrap my head around the SocketReadingWritingTest>>setUp. Based on what I know
> about TCP sockets it doesn't make sense to me. AFAIK to get both ends of a
> connected TCP connection (lacking a socketpair call) I need 3 sockets. A
> listening socket, a client socket (doing connect) and finally the server
> socket that comes out as a result of accept on the listener. So I'd expect to
> see something like this in the setUp:
>
> | data input output listener socket1 socket2 process sync |
> Socket initializeNetwork.
> sync := Semaphore new.
> listener := Socket newTCP.
> listener listenOn: 9999.
> process := [ [ socket1 := listener accept ] ensure: [ listener close ]. sync
> signal ] fork.
> socket2 := Socket newTCP.
> socket2 connectTo: (NetNameResolver localHostAddress) port: 9999.
> sync wait.
> output := socket1 reading.
> input := socket2 writing.
>
> Surprisingly, the above doesn't work, while many of the Socket tests seem to
> pass for me despite my brain telling me that it can't possibly. Can anyone
> shed some light on this for me ?
I have been playing around a little bit with your example and this works for me
(Pharo 1.1.1 + Xtreams):
| data input output listener socket1 socket2 process sync |
data := #uninitialized.
sync := Semaphore new.
listener := Socket newTCP.
listener listenOn: 9999 backlogSize: 10.
process := [ [
socket1 := listener waitForAcceptFor: 10.
socket1 waitForDataFor: 10.
output := socket1 reading.
data := output rest.
sync signal ] ensure: [ listener close ] ] fork.
socket2 := Socket newTCP.
socket2 connectToHostNamed: 'localhost' port: 9999.
input := socket2 writing.
input write: 'Hello!'.
sync wait.
data asString
Of course, you still have to close some sockets, but you get the idea.
HTH,
Sven
PS: Yes, Socket (and friends) have some pretty confusing API, you have to stick
to what you know that works ;-)