perl - 驼鹿对象中Socket属性的奇怪行为

标签 perl sockets moose

我有一个Moose对象,它具有IO::Socket::INET对象作为其属性之一:

has socket => (
    is => 'ro',
    required => 1,
    lazy => 1,
    isa => 'IO::Socket::INET',
    builder => 'connect',
);

套接字在如下所示的脚本中初始化(删除了身份验证部分):
sub connect {
    my $self = shift;
    my $host = 'A.B.C.D';
    my $port = N;

    my $handle = IO::Socket::INET->new(
        Proto     => "tcp",
        PeerAddr  => $host,
        PeerPort  => $port
    ) or die "can't connect to port $port on $host: $!";

    $handle->autoflush(1);

   # Connect to Server with $handle and authenticate
   # and if successful .......
    return $handle;
}

但是,当我运行以下测试代码时,我发现了奇怪的行为:
my $x = MyObject->new;
print $x->socket pack('I', 392);

服务器(A.B.C.D)接收的字节与我发送的字节完全不同。我检查了字节序或字节顺序不是问题。实际上,一个简单的脚本可以在不使用Moose的情况下创建套接字并写入相同的数据,因此效果非常理想-完全按照预期在服务器上接收到数据。

如果我的Moose属性是一个持久的IO::Socket::INET对象,我是否需要做的事情比做的还要多。套接字属性是否已关闭或在我背后被操纵?

谢谢你。

最佳答案

print文档说,对于块中的FILEHANDLE,您应该将比标量变量更复杂的事情封装起来。你有没有尝试过:

print { $x->socket } pack ('I', 392);

或者:
$x->socket->print (pack ('I', 392));

如果我不把大括号放在$x->socket上,则会出现语法错误。

以下代码对我有用。您确定验证部分没有问题吗?也许用wireshark看看套接字数据?
package Test;
use Moose;
use IO::Socket::INET;

has socket => (
    is => 'ro',
    required => 1,
    lazy => 1,
    isa => 'IO::Socket::INET',
    builder => 'connect',
);

sub connect {
        my $sock = IO::Socket::INET->new (
                Proto => "tcp",
                PeerAddr => "127.0.0.1",
                PeerPort => 2000,
        ) or die;
        $sock;
}

package main;

my $x = Test->new;
print { $x->socket } pack ('I', 392);

关于perl - 驼鹿对象中Socket属性的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5708191/

相关文章:

perl - 在 Mojolicious 中创建递归模板 block

perl - Gedit - 外部工具指定当前文件

Java 套接字 - 如何确定服务器端的数据类型?

perl - Moose 对象初始化后如何创建结构?

perl - 在我的许多基于 Moose 的子类中重写属性的最有效方法是什么?

python - 这些脚本语言中哪种更适合渗透测试?

perl - Perl中赋值运算符的结果列表评估不一致?

ios - 将 UDP 套接字绑定(bind)到蜂窝 IP

linux - Linux 中的 SO_WIFI_STATUS 套接字选项

perl - Moose真的这么慢吗?