Biker has asked for the wisdom of the Perl Monks concerning the following question:

I have an annoying socket related problem. After a lot of trial and error I have found a work-around to the problem and my code is now functional.

On the other hand, I don't understand why my work-around works, neither why it is required. This is where your help and explanations will be much appreciated.


I have a 'server' application that opens a socket. It then loops around an accept() on the socket. Whenever a client connects, the server reads and (for testing purposes only) discards anything read. It never writes anything to the socket. This part works fine.

I have a test client that does nothing but connect to the server socket and then closes the socket. It writes nothing to the socket before closing it.

This creates a major memory leak in the client application.

If I let the client write some arbitrary text to the socket, the problem remains. But, if I let the client read from the socket, the memory leak goes away (?!?!). There was nothing there to read. The client immediately gets a logical end-of-file, but it will not leak memory.


How can this be?


This is a code snippet that reproduces the problem:
#!/usr/bin/perl -w require 5.005; use strict; use IO::Socket; for(1..100000) { open_sock(); } exit; sub open_sock { my $answer; my $sock=IO::Socket::INET->new(PeerAddr=>'', PeerPort=>1955, Proto=>'tcp', Timeout=>20)|| die("Failed to open socket.\n"); # Writing to the socket makes no difference. #print $sock "x"; # Reading from the socket closes the memory leak. # Nothing gets printed on STDOUT from the print statement, # i.e. there was nothing to read. Right? while(defined($answer=<$sock>)) { print("Answer: $answer\n"); } close($sock); }


Everything went worng, just as foreseen.