sub send_msg { my ($msg_len, $device, $msg) = @_; my $sock = IO::Socket::INET->new(PeerAddr => $remote_host, PeerPort => $remote_port, Proto => "tcp", Type => SOCK_STREAM) or die "can't connect to $remote_host\n";
$msg = pack("A$msg_len", $msg); $msg = "" if ($device < 0); $msg_len = 0 if ($device < 0); $msg_len = pack("i1", $msg_len); $device = pack("i1", $device); print $sock $msg_len; print $sock $device; print $sock $msg; close($sock); }
|
这个函数的作用就是在sock上二进制发送数据,可以在对端用c写的代码从sock上接受数据
其中最重要的就是pack函数的使用
$msg_len = pack("i1", $msg_len);如果$msg_len是10的话,在输出就可以看到0A00 0000的样子,这是小端格式的输出。可以直接在网络上发送,在对端可以用字节流的sock来读取。
同样的代码我放到Solaris上今天执行了一次,发现输出的东西变成了0000 000A这就是两边字节序不一样造成的。这就是大端格式,在pack函数里面用N表示;同理我在windows上涌N得到的输出也是大端格式。
这样就取决于接收端是大端还是小端,网络格式其实就是大端。在windows上接受网络格式,需要对接受的4字节做转换才能变成普通的整数。
阅读(1792) | 评论(0) | 转发(0) |