perl - 尽管套接字是非阻塞的,但 Perl 上的 recv 阻塞

标签 perl sockets

我在守护进程中的 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/

相关文章:

linux - Perl:获取文件的时间戳并检查是否是今天

android套接字文件传输

c - TCP服务器通过多线程向多个客户端发送和接收数据

xml - 我如何轻松测试 XML 文件在 Perl 中的格式是否正确?

c - TOR 上的基本 C Windows TCP 套接字,recv() 挂起?

c++ - 编译器优化创建系统调用?

java - 通过套接字接收 Diffie-Hellman key 错误

python - 搜索基因组中不匹配的序列

regex - 删除字符串中的前导、尾随和多个空格

apache - 除了创建符号链接(symbolic link)之外,a2ensite 还能做什么?