我在守护进程中的 perl 中创建了一个这样的套接字
IO::Socket::INET->new(LocalPort => $port,
Proto => 'udp',Blocking => '0') or die "socket: $@";
在 Linux 机器上
套接字在 recv 调用期间表现得像预期的非阻塞套接字
$sock->recv($message, 128);
.但是,我一直观察到,当 eth0 上的 VIF 在守护程序运行并接收数据时重新配置时,recv 调用开始阻塞。
这是一个非常令人困惑的问题。我做了
$sock->recv($message, 128, MSG_DONTWAIT);
并且 recv 调用变为非阻塞。我用谷歌搜索但看不到使用 UDP 非阻塞套接字的建议方法是什么。
最佳答案
首先,字面答案:
# Portable turn-off-blocking code, stolen from POE::Wheel::SocketFactory.
sub _stop_blocking {
my $socket_handle = shift;
# Do it the Win32 way.
if ($^O eq 'MSWin32') {
my $set_it = "1";
# 126 is FIONBIO (some docs say 0x7F << 16)
# (0x5421 on my Linux 2.4.25 ?!)
ioctl($socket_handle,0x80000000 | (4 << 16) | (ord('f') << 8) | 126,$set_it) or die "can't ioctl(): $!\n";
}
# Do it the way everyone else does.
else {
my $flags = fcntl($socket_handle, F_GETFL, 0) or die "can't getfl(): $!\n";
$flags = fcntl($socket_handle, F_SETFL, $flags | O_NONBLOCK) or die "can't setfl(): $!\n";
}
}
但是,我强烈建议您使用 AnyEvent::Handle !
关于perl - 尽管套接字是非阻塞的,但 Perl 上的 recv 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11895632/