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

In reply to Re: communication between server/client by zentara
in thread communication between server/client by hari9

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.