This was tested with Perl 5.8-RC2, I got now the 5.8
release and will compile it for test! If you want to test
is very simple, just make a socket srv and client and send
something like "A\nA" from the client and see what it
reads, 65,10,65 or 65,13,10,65. Remember this bug is for
Win32.
I tested with
$ENV{PERLIO} = ":raw" ;
and nothing (still RC2).
To get speed, here are my test script:
SERVER:
#!/usr/bin/perl
$|=1;
$ENV{PERLIO} = ":raw" ;
sub SOCKET_init {
$| = 1 ; use Socket;my $p=getprotobyname('tcp');
socket(SRV,PF_INET,SOCK_STREAM,$p);
setsockopt(SRV,SOL_SOCKET,SO_REUSEADDR,pack('l',1));
my($opn,$try);
while($opn!=1 && $try<=20){
if(bind(SRV,sockaddr_in($_[0],INADDR_ANY))){$opn=1}
else{$try++;sleep(1)}}
if($opn!=1){print"ERROR! Port $_[0] in use.\n";exit}
listen(SRV,SOMAXCONN);my($wpid,$pad)=(0);
$SIG{CHLD}=\&REAPER;my $CLT;
for($wpid=0;&ACT_CLT;$wpid=0,close(NS)) {
next if $wpid and not $pad;my($p,$a)=sockaddr_in($pad);
my @i=unpack('C4',$a);$CLT++;$PORTS{$CLT}=$p;
$IPS{$CLT}=join('.',@i);my $sl=select(NS);$|=1;
select($sl);if($_[1]=~/^(1|ye?s?|si?m?)$/i){
&SPAWN($CLT)}else{&Server_DO($CLT)}}
sub REAPER{$wpid=wait;$SIG{CHLD}=\&REAPER}
sub ACT_CLT{return($pad=accept(NS,SRV)) || $wpid}
sub SPAWN {
my ( $CLIENT_id ) = @_ ; my $pid ;
if (!defined($pid = fork)) {
print "cannot fork: $!\n" ; return ;}
elsif ($pid) { return ;}
exit &Server_DO($CLIENT_id) ;
}
}
sub Server_DO { # Your commands to do whe the client are connected:
my ( $CLIENT_id ) = @_ ;
print "New Client! <$CLIENT_id>\n" ;
print "PORT: $PORTS{$CLIENT_id}\n" ;
print "IP: $IPS{$CLIENT_id}\n" ;
while( sysread(NS, $buffer , 3) ) {
&BYTES($buffer) ;
$var = "A\nA" ;
print NS $var ;
exit;
}
print "Client $CLIENT_id DOWN!\n" ;
close(NS) ;
}
my $port = 2345 ;
my $SRV_fork = 0 ;
print "Sock Init\n" ;
&SOCKET_init($port,$SRV_fork) ; # Start the server.
exit;
#########
# BYTES #
#########
sub BYTES {
my @d = split(//s , @_[0] );
foreach my $d_i ( @d ) {
my $s = unpack("C", $d_i ) ;
print "$s\n" ;
}
}
CLIENT:
#!/usr/bin/perl
use IO::Socket ;
$ENV{PERLIO} = ":raw" ;
$|=1;
my $port = 2345 ;
my $host = 'localhost' ;
my $sock = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
Timeout => 30 ,
) ;
if (! $sock) { die "ERROR! Ca'nt connect\n" ;}
$sock->autoflush(1);
print $sock "A\nA" ;
sysread($sock, $read , 3) ;
&BYTES($read) ;
close($sock) ;
exit;
sub BYTES {
my @d = split(//s , @_[0] );
foreach my $d_i ( @d ) {
my $s = unpack("C", $d_i ) ;
print "$s\n" ;
}
}
|