我定义为非阻塞的套接字块有问题。
这样我就制作了一个新的套接字:
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)))
{
}