我试图在运行应用程序的同一台PC上模拟TCP服务器。 我不知道它是否可以在Perl中完成,因为我不是很有经验。
使用下面的代码,第一个回复正在运行,但我不知道如何实现第二个。
#!/usr/bin/perl -w
use IO::Socket::INET;
use strict;
my $socket = IO::Socket::INET->new('LocalPort' => '3000',
'Proto' => 'tcp',
'Listen' => SOMAXCONN)
or die "Can't create socket ($!)\n";
print "Server listening\n";
while (my $client = $socket->accept) {
my $name = gethostbyaddr($client->peeraddr, AF_INET);
my $port = $client->peerport;
while (<$client>) {
print "$_";
print $client "RESPONSE1";
}
close $client
or die "Can't close ($!)\n";
}
die "Can't accept socket ($!)\n";
编辑:谢谢你们的支持,我最终用php完成了它的工作,耶!
答案 0 :(得分:2)
使用Net::Server进行连接,并使用sub中的变量来保持当前状态(此代码中为$ state);像这样的东西:
package MyServer;
use base qw/Net::Server/;
use strict;
use warnings;
sub process_request {
my $self = shift;
my $state = 0;
while (<STDIN>) {
s/\r?\n$//; # like chomp but for crlf too
if ($state == 0 and $_ eq 'data1') {
print "> okay1\n";
$state++;
} elsif ($state == 1 and $_ eq 'data2') {
print "> okay2\n";
$state++;
} else {
last if $state == 2;
$state = 0;
}
}
}
my $port = shift || 3000;
MyServer->run( port => $port );
Net :: Server POD中的示例建议使用警报来超时连接,这可能是合适的。上面的代码执行以下操作:
$ nc localhost 3000
data1
> okay1
data2
> okay2
data3
$
如果您需要转移到分叉/预执行/非阻塞/协同例程驱动的系统,那么就具有Net :: Server的个性。
答案 1 :(得分:0)
“准备好了”代码:
package MyServer;
use base qw/Net::Server/;
use strict;
use warnings;
sub process_request {
my $self = shift;
my $state = 0;
$| = 1;
binmode *STDIN;
while (read(*STDIN, local $_, 3 )) {
if ($state == 0 and $_ eq "\x{de}\x{c0}\x{ad}") {
print "\x{c4}\x{1a}\x{20}\x{de}";
$state++;
} elsif ($state == 1 and $_ eq "\x{18}\x{c0}\x{0a}") {
print "\x{11}\x{01}\x{73}\x{93}";
$state++;
last;
}
}
}
my $port = shift || 3000;
MyServer->run( port => $port );
答案 2 :(得分:0)
在设置低端口时(在我的情况下,端口23 ),process_request sub似乎无法正常工作。特别是只有低端口,在解析数据输入时,第一个请求包含额外的字符(但后续请求都可以)。 你有提示吗?谢谢