##
Socket().Write( Request.begin(), Request.length() );
####
Socket().Read(&msgLen, sizeof(msgLen));
msgLen = ntohl(msgLen); // convert back from network ordered long int
Socket().Read(&buffer, msgLen); // read response into buffer
####
char msg2[256];
memset(msg2,0,256);
Socket().Read(msg2,4u); // first read 4 bytes with buffer size
log.Printf("1. msg2: %04X %04X %04X %04X\n", msg2[0], msg2[1], msg2[2], msg2[3]);
log.Printf("2. msg2: %d %d %d %d\n", msg2[0], msg2[1], msg2[2], msg2[3]);
unsigned long nlen = *(unsigned long *)msg2; // convert char string (bytes) to int
log.Printf("before ntohl: nlen = %d (hex: %04X)", nlen, nlen);
nlen = ntohl(nlen); // convert back from network ordered long int
log.Printf("after ntohl: nlen = %d (hex: %04X)", nlen, nlen);
Socket().Read(msg2, nlen); // read the request
log.Printf("Request: %s", msg2);
####
New client connection accepted
1. msg2: 0000 0000 0000 0011
2. msg2: 0 0 0 17
before ntohl: nlen = 285212672 (hex: 11000000)
after ntohl: nlen = 17 (hex: 0011)
Request: abcdefghijklmnopq
Response: hello world
Closing connection.
####
New client connection accepted
msg2: 0032 0038 0035 0032
msg2: 2 8 5 2
msg2: 50 56 53 50
before ntohl: nlen = 842348594 (hex: 32353832)
after ntohl: nlen = 842544434 (hex: 32383532)
####
#!/usr/bin/perl
use strict;
use IO::Socket;
use IO::Select;
$| = 1;
my $host = 'localhost';
my $port = '3000';
my $data;
my $socket = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
Type => SOCK_STREAM,
Blocking => 1,
Timeout => 10,
) or die "Couldn't connect to $host:$port : $!";
my $sel = IO::Select->new($socket) or die "IO::Select error $!";
my $request = "abcdefghijklmpnoq";
my $request_length = length($request);
print "Request:\n$request\n";
print "length(request) = $request_length\n"; # 17
my $x = htonl($request_length);
print "x = $x\n"; # 285212672
printf("x = %x\n", $x); # 11000000
if ($sel->can_write(10)) {
$socket->autoflush(1);
# write request length
# THIS IS WHERE I THINK SOMETHING IS GOING WRONG - THE SERVER GETS THE WRONG LENGTH HERE!!!
$socket->send( htonl($request_length) ) or die "3a Couldn't write to socket: $!";
# write request
$socket->send( $request ) or die "3b Couldn't write to socket: $!";
if ($sel->can_read(10)) {
# read response length
$socket->recv($data, 4) or die "5 Couldn't read data from server: $!";
my $reponse_length = ntohl($data);
if ($sel->can_read(10)) {
# read response
$socket->recv($data, $reponse_length) or die "6 Couldn't read data from server: $!";
print "Response:\n$data\n";
} else {
print "can't read 2: $@ : $!";
}
} else {
print "can't read 1: $@ : $!";
}
} else {
print "can't write: $@ : $!";
}
$socket->close();
sub htonl {
my $input = shift;
my $output = unpack('N*',pack('L*',$input));
return $output;
}
sub ntohl {
my $input = shift;
my $output = unpack('L*', pack('N*', $input));
return $output;
}