gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:56:32 24 4
gpt4 key购买 nike

我有一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com