[英]Unable to read client's message using AnyEvent::Socket and tcp_connect (to a UNIX domain socket)
運行以下服務器和客戶端腳本:
服務器(更新):
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say' ;
use AnyEvent ;
use AnyEvent::Socket ;
use AnyEvent::Handle ;
tcp_server 'unix/', '/tmp/.mysocket', sub {
my ( $fh, @args ) = @_ ;
say "Received request" ;
my $hdl = AnyEvent::Handle->new( fh => $fh ) ;
$hdl->push_read(
line => sub {
my ( $hdl, $line ) = @_ ;
say "Received $line" ;
}
) ;
}, sub {
my ( $fh, @sock ) = @_ ;
say "Bound to @sock" ;
} ;
AnyEvent->condvar->recv ;
exit ;
客戶端(更新):
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say' ;
use AnyEvent ;
use AnyEvent::Socket ;
use AnyEvent::Handle ;
my $done = AnyEvent->condvar ;
tcp_connect "unix/", "/tmp/.mysocket", sub {
my ( $fh ) = @_ or die "unable to connect: $!" ;
say "Connected" ;
my $hdl = AnyEvent::Handle->new( fh => $fh ) ;
$hdl->push_write( "Hello world!\n" ) ;
$done->send ;
} ;
$done->recv ;
say $! ;
exit ;
服務器接收並接受連接請求,但客戶端收到“非法搜索”錯誤,跳過tcp_connect
定義的回調並退出而不向服務器發送“Hello world”消息。
我究竟做錯了什么?
好的.. 我發現由於AnyEvent
模塊的異步性質,客戶端會因為腳本結束而獲得“非法搜索”。 添加一個condvar
變量我解決了這個(非)問題,但服務器仍然沒有收到客戶端發送的消息。
我不確定是什么導致了“非法搜索錯誤”,但我發現了一些至少現在有效的東西。 客戶端需要在連接回調中使用條件變量:
my $client_done = AnyEvent->condvar;
tcp_connect "unix/", "/tmp/.mysocket", sub {
my ( $fh ) = @_ or die "unable to connect: $!" ;
say "Connected" ;
my $hdl = AnyEvent::Handle->new( fh => $fh ) ;
$hdl->push_write( "Hello world!\n" ) ;
$client_done->send;
};
$client_done->recv;
say "Done";
此外,服務器不應使用on_read
回調,而應使用push_read()
方法:
my $server_done = AnyEvent->condvar;
tcp_server 'unix/', '/tmp/.mysocket', sub {
my ( $fh, @args ) = @_ ;
say "Received request" ;
my $hdl ;
$hdl = AnyEvent::Handle->new(
fh => $fh,
on_eof => sub {
say "server_eof";
$server_done->send;
undef $hdl;
}
);
$hdl->push_read (
line => sub {
say "server got line <$_[1]>";
}
);
}, sub {
my ( $fh, @sock ) = @_ ;
say "Bound to @sock" ;
};
say "Waiting for server done..";
$server_done->recv;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.