PHP 数据包以 perl 格式发送



我有这段代码在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 );

最新更新