in reply to select appears to ignore pending data on socket.

I suspect your problem is related to this:
#pull data from the socket my $data = <$sock>;
If the currently available data on $sock does not contain a newline (or whatever you've set the record separator to), that call will block until it does.

The same sort of thing may happen if you print() to a socket and the other side is slow in receiving.

You should probably make sure that the sockets are non-blocking (see IO::Socket::INET) and use the recv() and send() calls to recieve and send data - since they will work right on non-blocking calls.

Replies are listed 'Best First'.
Re^2: select appears to ignore pending data on socket.
by Zidane (Acolyte) on Nov 03, 2007 at 19:35 UTC

    that's what is so troubling, the data does contain several lines of text, each terminating with a newline. i have captured the raw traffic using wireshark (which in turn uses tcpdump), and verified the data is coming in correctly. the data is there, ready and waiting, it just appears that select is not triggering for it.

    i have also tried using blocking and non-blocking sockets with no success, i receive the same result regardless of the blocking state.

    i had looked at recv, but it appears to receive a sring of data of a set length, unfortunately i do not know the length of each line in advance and i am cautions about reading in too much data to read past the newline and into the start of the next line.

Re^2: select appears to ignore pending data on socket.
by Zidane (Acolyte) on Nov 03, 2007 at 20:18 UTC

    i have just tried using recv to read the data in from the socket and got exactly the same results. i am sure it is a problem with the select call somewhere. it is just not triggering from the data pending on the socket.

    i fail to understand why select would simply ignore pending data.

        i beleive i have found the bug......

        in the following section of code:-

        #create new client socket object sub create_new_client_sock { #create socket my $sock = IO::Socket::INET->new( PeerAddr => $conf_file->{server}, PeerPort => $conf_file->{port}, Blocking => 0, ); #check if socket exists if (!($sock)) { die "could not establish socket to " . $conf_file->{server} . +":" . $conf_file->{port} . "\n"; } #return socker object reference return $sock; }

        it would appear that if i set the socket to non-blocking, the script fails with the symptoms described. but if i set it to blocking, then it works perfectly...

        i am mystified as to why, and to be frank, right now i am past caring, it has taken me all day to figure this out, including three different writes (using a while loop, event module and select).

        thankyou for your patience and your help, but i think i am going to call it a day for now and try and figure out what i did wrong in the morning.

        the whole script and the configuration file

        well, for a moment i thought i had it working..... but it would appear i dont.

        it would appear that the select can_read only triggers when a new packet is received, not when there is data in the socket buffer, and for some reason i am not emptying the sockets entire buffer.