【问题标题】:How can I modify received socket messages in Perl?如何在 Perl 中修改接收到的套接字消息?
【发布时间】:2009-03-11 06:03:30
【问题描述】:

我正在编写一个 Perl 程序,它从两个套接字发送和接收消息,并充当开关。我必须修改从一个套接字接收到的消息,将 3 个字节添加到数据中,最后将修改后的消息发送到另一个套接字。我采用 select()...sysread()...syswrite() 机制来轮询套接字之间的消息。接收到的消息在修改时保存在 $buffer 中。

现在我可以使用以下方式来获取收到的消息:

my $hexmsg = unpack("H*", $buffer);
my @msg = ( $hexmsg =~ m/../g );

然后我可以在@msg 中插入 3 个字节。但是,我不知道如何将@msg 中的消息打包成一个标量(例如$buffer)并通过syswrite() 将其发送到另一个套接字。有谁能够帮我?提前谢谢!

顺便说一句,$buffer 中的消息是二进制文件吗?

【问题讨论】:

  • 此外,我已经尝试过我的 $shexmsg=join("",@msg); $buffer=pack("X",$shexmsg);其中“X”表示pack的模板,如“n*”、“b*”、“u*”。然而,一切都失败了……我不知道该怎么办……

标签: perl sockets


【解决方案1】:

是的,$buffer 中的消息是二进制的(如果我猜对了你的意思的话)。如果您将其解压缩到 @msg 的唯一原因是插入字节,请不要。请改用substr,然后写出更改的$buffer。例如:

substr( $buffer, 0, 0, "\x01\x02\x03" ); # insert 3 bytes at beginning.

如果您正在使用 @msg 做其他事情,您可以继续使用它以及 在写出之前进行 substr 插入,或者您可以使用 substr 或 pack 或 split 或 vec 或正则表达式来解析出您需要的部分。你需要描述你的 正在做以获得更具体的帮助。

【讨论】:

  • 除了向$buffer插入3个字节外,我还需要识别消息的头部和正文。我该怎么办? substr() 还能用吗?
  • 最后我使用@msg 来分析消息并将 3 个字节插入到 $buffer 中以获取特定消息。我认为使用 substr($buffer,,) 可以获得消息的特定信息分析(例如msg类型用1字节表示),但我没有尝试这种方式。
  • 对了,如果我也想修改$buffer的前两个字节,怎么办?因为$buffer的前两个字节表示消息的长度,在消息中插入3个字节后,消息的长度也要相应的改变。
【解决方案2】:

如果您使用unpack$buffer 获取数据,您是否尝试使用pack 将数据放回那里?

【讨论】:

  • 据我所知,这具有两种方式使用几乎完全相同的代码的好处。不过,我可能是错的 - pack() 和 unpack() 是我目前在 Perl 中的弱点。
  • 我试过我的 $shexmsg=join("",@msg); $buffer=pack("X",$shexmsg);其中“X”表示pack的模板,如“n*”、“b*”、“u*”。然而,一切都失败了……我不知道该怎么办……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多