I'm just getting started with network programming, and have managed to get a bidirectional client script from a book or some other howto on the net connected to my av receiver.

The hardware sends out status updates to an open connection, so in this example I'm not sending anything, just listening for updates from the hardware. The hardware sends the data in hex format, so I'm not sure if that causes a problem with the <$handle> reading of the data.

When I receive an update through the connected socket, the while loop handling the socket read, seems to split the data from the network packet into 2. I added a couple of print and length statements to help illustrate my point.

Here is the output from the script when run.
ryan@ryan-laptop:~/Documents/sockets$ perl bidir.pl 192.168.0.61 60128 [Connected to 192.168.0.61:60128] inc data! packet is >ISCP < data length is 12< inc data! packet is >!1MVL2D&#9618; < data length is 14< ^C ryan@ryan-laptop:~/Documents/sockets$ hd dump.bidir 00000000 49 53 43 50 00 00 00 10 00 00 00 0a 01 00 00 00 |ISCP..... +.......| 00000010 21 31 4d 56 4c 32 44 1a 0d 0a |!1MVL2D.. +.| 0000001a
Now I have wireshark running at the same time, and it says only one data packet was sent, and it's data size was 26 bytes. So I'm wondering, why my socket read is splitting the 26 bytes that came from the network in 2? Here is the bidir.pl script I'm using
#!/usr/bin/perl -w # biclient - bidirectional forking client use strict; use IO::Socket; use Data::Dumper qw(Dumper); #open OUT, ">dump.bidir"; my ($host, $port, $kidpid, $handle, $line); unless (@ARGV == 2) { die "usage: $0 host port" } ($host, $port) = @ARGV; # 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()); if ($kidpid) { # parent copies the socket to standard output while (defined ($line = <$handle>)) { #print STDOUT $line; print "inc data!\npacket is >$line<\n"; print "data length is " . length($line) . "<\n"; open OUT, ">>dump.bidir"; print OUT $line; close OUT; } kill("TERM" => $kidpid); # send SIGTERM to child } else { # child copies standard input to the socket while (defined ($line = <STDIN>)) { print $handle $line; } } exit;

In reply to Network socket noob, why is my socket read not getting all the data from a packet? by zen0n

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.