Если вы используете Peer*
при создании IO::Socket::INET
, будет вызван connect()
, который задает имя узла сокета.В таком сокете вам никогда не придется указывать адрес удаленного сокета, потому что он имеет адрес по умолчанию.
IO :: Socket :: send () имеет «функцию»:он игнорирует параметр TO
, когда сокет имеет допустимое имя узла:
my $r = defined(getpeername($sock))
? send($sock, $_[1], $flags)
: send($sock, $_[1], $flags, $peer);
Это изменение было введено в IO 1.12 , что, к сожалению, предшествует истории текущего gitрепозиторий :
Модифицированный IO :: Socket :: send, чтобы не передавать 4 аргумента для отправки при подключенном сокете
Если вам не нравитсяВ этом случае вам придется использовать raw CORE::send()
, то есть:
#!/usr/bin/perl
use warnings;
use strict;
use IO::Socket::INET;
use Socket qw(pack_sockaddr_in);
my $client = IO::Socket::INET->new(
PeerAddr => '127.0.0.1',
PeerPort => 2000,
Proto => 'udp',
) or die "client socket: $!\n";
my $addr = pack_sockaddr_in(2000, inet_aton('127.0.0.1'));
$client->send('ABCD', 0)
or die "IO::Socket::send() no addr: $!\n";
$client->send('ABCD', 0, $addr)
or die "IO::Socket::send() with addr: $!\n";
send($client, 'ABCD', 0, $addr)
or die "send() with addr: $!\n";
exit 0;
Тестовый прогон:
$ strace -e sendto,connect,socket perl dummy.pl
socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, IPPROTO_UDP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(2000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
sendto(4, "ABCD", 4, 0, NULL, 0) = 4
sendto(4, "ABCD", 4, 0, NULL, 0) = 4
sendto(4, "ABCD", 4, 0, {sa_family=AF_INET, sin_port=htons(2000), sin_addr=inet_addr("127.0.0.1")}, 16) = 4
Strace с моего компьютера Linux указывает, что send()
сопоставлен с sendto()
, потому что код Perl вызывает send () и sendto () .
UPDATE: Я создал восходящий билет # 133936 .