Chinaunix首页 | 论坛 | 博客
  • 博客访问: 326246
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类:

2010-08-07 14:17:12

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) |
给主人留下些什么吧!~~