作者xatier (xatier)
看板Perl
标题[请益] Perl socket nonblocking I/O
时间Wed May 9 04:37:58 2012
最近想尝试一下 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
1F:推 scwg:你想消除的 "blocking" 感觉是 client 端读 console 的 line 05/09 06:19
2F:→ scwg: buffer 耶, 把 client 改过这个 server 应该不用动. 05/09 06:19
3F:推 kornelius:建议用 AnyEvent::Socket :-) 05/10 14:15
4F:→ xatier:@scwg: 那要怎麽做到像 BBS 这样可以即时响应的功能呢@@ 05/11 03:33
5F:→ xatier:@kornelius: 感谢,我试试看! 05/11 03:34
6F:→ xatier:成功罗~ 感谢! 05/15 01:24
9F:→ xatier:基本的 IO 都做好罗 :D 05/15 01:26