in reply to Re^4: Read Socket on Server
in thread Read Socket on Server

That's not how it should behave, and I cannot replicate your results (ActivePerl 5.8.8 on WinXP).

sysread blocks until the server sends data, and which point the data is returned in $data, overwriting what's already there.

The only reason you'd get the same data repeatedly was if the server was sending it repeatedly.

For testing, I used

#!/usr/local/bin/perl # client.pl use strict; use Socket; use Time::HiRes qw( sleep ); use IO::Handle; my $prot = getprotobyname('tcp'); my $host = inet_aton("localhost"); socket(SOCK, AF_INET, SOCK_STREAM, $prot) or die("socket failed to sta +rt"); my $dest_addr = sockaddr_in(5003, $host); connect(SOCK, $dest_addr) or die("Connect failed"); my $data = 'aaaaaaaaaaaaaaaaaaaaaaaa'; while (1) { print STDERR "do a read\n"; sysread(SOCK, $data, 1024); # reads the data on the serve +rs socket # but when loop around again +the data is still there as server # has not written anything ne +w print STDERR "data was $data\n"; sleep(0.2); } close SOCK;
#!/usr/bin/perl # server.pl use strict; use warnings; use IO::Socket::INET; my $sock = IO::Socket::INET->new( Proto => 'tcp', LocalPort => 5003, Listen => 1, ) or die; my $client = $sock->accept() or die; for (;;) { my $x = sprintf( '%04d', rand(1000) ); print( "$x\n" ); print $client ( $x ) or last; sleep(1); }

By the way,

use IO::Handle; my $prot = getprotobyname('tcp'); my $host = inet_aton("localhost"); socket(SOCK, AF_INET, SOCK_STREAM, $prot) or die("socket failed to sta +rt"); my $dest_addr = sockaddr_in(5003, $host); connect(SOCK, $dest_addr) or die("Connect failed");

is much more readable as

use IO::Socket::INET; my $sock = IO::Socket::INET->new( Proto => 'tcp', PeerAddr => 'localhost', PeerPort => 5003, ) or die $!;