我有这段代码在PHP中发送数据包,我想知道如何在perl中做到这一点,我尝试通过十六进制数据发送,但它不起作用。这是PHP代码:
$sIPAddr = "37.221.175.211";
$iPort = 7777;
$sPacket = "";
$aIPAddr = explode('.', $sIPAddr);
$sPacket .= "SAMP";
$sPacket .= chr($aIPAddr[0]);
$sPacket .= chr($aIPAddr[1]);
$sPacket .= chr($aIPAddr[2]);
$sPacket .= chr($aIPAddr[3]);
$sPacket .= chr($iPort & 0xFF);
$sPacket .= chr($iPort >> 8 & 0xFF);
$sPacket .= 'c';
$rSocket = fsockopen('udp://'.$sIPAddr, $iPort, $iError, $sError, 2);
fwrite($rSocket, $sPacket);
fclose($rSocket);
我将如何在 Perl 中做到这一点?我也想使用原始套接字来发送它。
这是我尝试过的,但服务器没有回复它,这让我认为数据在某处损坏了:
$packet = Net::RawIP->new({
ip => {
saddr => $saddr,
daddr => $dest,
},
udp => {
source => $rsport,
dest => $port,
data => "x53x41x4dx50x25xddxafxd3x61x1ex63", # this is the data from the PHP file in HEX
},
});
$packet->send;
不知道Net::RawIP
,但这里是Perl变体,它使用IO::Socket::INET
模块发送与PHP代码完全相同的数据包。有关其文档,请参阅 https://metacpan.org/pod/IO::Socket::INET
use strict;
use warnings;
use IO::Socket;
my $sIPAddr = '37.221.175.211';
my $iPort = 7777;
my $sPacket = 'SAMP' . join( '', map chr,
split(/./, $sIPAddr),
$iPort & 0xFF,
$iPort >> 8 & 0xFF,
) . 'c';
my $sock = IO::Socket::INET->new(
Proto => 'udp',
PeerPort => $iPort,
PeerAddr => $sIPAddr,
) or die "Could not create socket: $!n";
$sock->send( $sPacket );