in reply to communication between server/client

I just quickly went thru your code, and didn't see any protocol for telling the server and client to be in recv or send mode. You appear to be having a deadlock problem, where the server expects to be in recv mode, and the client in send mode. When you try and use the socket filehandle to receive, both ends sit and wait. You need to either use IO::Select on the sockets, to detect when you can_read or use the recv and send methods of IO::Socket.

Think of it like in the old walkie-takie days.... when one end was done sending, they would say "over", and that would signal the other end to start sending instead of listening to the socket filehandle.

My first guess is to put the client into recv mode just before closing the socket, like:

# write on the socket to server. $_=join(' ',$status,$md,$md_others); @data=split(" ",$_); foreach $_(0..$#data) { print $socket $data[$_]; } #untested pseudo code my $data; $socket->recv(data,1024); # from perldoc IO::Socket print $data; $socket->close();
But the best way to avoid this send-recv business is to use IO::Select, and use
while( $select->can_read){}
code blocks. Search google for "perl IO::Select socket" and get tons of code.

Here are some old examples: Look at the perl code at UNO socket code tutorials and Problems reading back from socket

Also,. you may want to try a forked client which acts more like a bidirectional Telnet connection. The following client avoids the socket send-recv lockup problem, by forking, and have 1 fork for send and 1 fork for recv.

#!/usr/bin/perl -w use strict; use IO::Socket; my ( $host, $port, $kidpid, $handle, $line ); ( $host, $port ) = ('localhost',15005); my $name = shift || ''; if($name eq ''){print "What's your name?\n"} chomp ($name = <>); # create a tcp connection to the specified host and port $handle = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => $port ) or die "can't connect to port $port on $host: $!"; $handle->autoflush(1); # so output gets there right away print STDERR "[Connected to $host:$port]\n"; # split the program into two processes, identical twins die "can't fork: $!" unless defined( $kidpid = fork() ); # the if{} block runs only in the parent process if ($kidpid) { # copy the socket to standard output while ( defined( $line = <$handle> ) ) { print STDOUT $line; } kill( "TERM", $kidpid ); # send SIGTERM to child } # the else{} block runs only in the child process else { # copy standard input to the socket while ( defined( $line = <STDIN> ) ) { print $handle "$name->$line"; } }

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku

Replies are listed 'Best First'.
Re^2: communication between server/client
by hari9 (Sexton) on Aug 03, 2010 at 21:59 UTC

    Thanks guys, I finally figured it out. I had to put
    $client_socket->shutdown(0); #at the server end.
    and $socket->shutdown(1); #at the client end.

    Salute!