1

我定义为非阻塞的套接字块有问题。

这样我就制作了一个新的套接字:

   unlink "/tmp/mysock";
   $socket = IO::Socket::UNIX->new(Local => "/tmp/mysock",
                                   Type      => SOCK_DGRAM,
                                   )
   or die "SOCKET CREATION FAILED: $!\n";
   $socket->blocking(0);

   $client = IO::Socket::UNIX->new(Peer => "/tmp/mysock",
                                   Type => SOCK_DGRAM
                                  )
   or die "CLIENT SOCKET: $!\n";
   $client->blocking(0);

这就是我从线程#1 发送消息的方式:

while ( $client->send(pack("LLLL", $_[0], $_[1], $_[2], $_[3]).join(':', @_[4..$#_]), 0) eq undef)
{
    #Error logging here
}
$client->flush();

这就是我在线程#2 中接收消息的方式

while (1)
{
    my $fds=epoll_wait($poll, 10000, -1) or next; # next when error

    foreach my $fd (@{$fds})
    {
        if ($fd->[0] == fileno($socket))
        {

            while ($socket->recv($msg,64,0))
            {
                #Processing the message
            }
        }
    }
}

问题是尽管任何一个$socket或被$client定义为非阻塞循环$socket中的块,while ($socket->recv($msg,64,0))直到下一条消息到来。我在这里错过了什么吗?我能做些什么来避免这种阻塞?

提前致谢!:)

更新

这样它的工作原理:

use Socket;

while ( !defined(send($client,pack("LLLL", $_[0], $_[1], $_[2], $_[3]).join(':', @_[4..$#_]),0)))
{
}

while (defined(recv($server,my $msg,64,0)))
{
}
4

0 回答 0