in reply to communication between server/client
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:
But the best way to avoid this send-recv business is to use IO::Select, and use# 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();
code blocks. Search google for "perl IO::Select socket" and get tons of code.while( $select->can_read){}
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"; } }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: communication between server/client
by hari9 (Sexton) on Aug 03, 2010 at 21:59 UTC |