[請益] Perl socket nonblocking I/O

看板Perl作者 (xatier)時間12年前 (2012/05/09 04:38), 編輯推噓2(207)
留言9則, 3人參與, 最新討論串1/1
最近想嘗試一下 Perl 的網路程式設計 寫了以下的支援多人連線的 echo 程式 #!/usr/bin/perl use 5.012; use strict; use warnings; use Term::Cap; use IO::Socket::INET; $|++; my $listener = IO::Socket::INET->new(LocalPort => 3126, Listen => 5, Proto => 'tcp', Reuse => 1, Blocking => 0,) or die "Cannot create socket\n"; $listener->autoflush(1); while (1) { next unless my $client = $listener->accept(); defined (my $child = fork()) or die "fork error: $!"; if ($child == 0) { $listener->close(); ctd ($client); exit 0; } $client->close(); } sub ctd { my ($socket) = @_; my $data; $socket->send ("Hi> "); while (sysread($socket, $data, 1) == 1) { #print $data; $socket->send ("$data"); $socket->send ("\r\nHi> ") if ($data =~ '\n'); last if ($data eq 'q'); } $socket->close(); } ==================================== 目前想做一點改進 有辦法讓這個程式的 I/O 變成 non-blocking 的嗎? 想要做到 client 這邊輸入東西不用按下 Enter 送出 server 端就可以抓到 socket 送 來的 keyboard input 想做一些簡單的互動遊戲XDD 麻煩了 <(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.247.99

05/09 06:19, , 1F
你想消除的 "blocking" 感覺是 client 端讀 console 的 line
05/09 06:19, 1F

05/09 06:19, , 2F
buffer 耶, 把 client 改過這個 server 應該不用動.
05/09 06:19, 2F

05/10 14:15, , 3F
建議用 AnyEvent::Socket :-)
05/10 14:15, 3F

05/11 03:33, , 4F
@scwg: 那要怎麼做到像 BBS 這樣可以即時響應的功能呢@@
05/11 03:33, 4F

05/11 03:34, , 5F
@kornelius: 感謝,我試試看!
05/11 03:34, 5F

05/15 01:24, , 6F
成功囉~ 感謝!
05/15 01:24, 6F

05/15 01:26, , 7F

05/15 01:26, , 8F

05/15 01:26, , 9F
基本的 IO 都做好囉 :D
05/15 01:26, 9F
文章代碼(AID): #1FgOGe6S (Perl)