为我的英语道歉。 我的套接字有问题。
#!/usr/bin/perl -w
use strict;
use POSIX;
use POSIX ":sys_wait_h";
use IO::Socket;
use IO::Handle;
use DBI;
my $pid= fork();
exit() if $pid;
die "Couldn't fork: $! " unless defined($pid);
POSIX::setsid() or die "Can't start a new session $!";
my $time_to_die =0;
my $server;
sub signal_handler {
$time_to_die = 1;
close($server);
}
$SIG{INT}= $SIG{TERM} = \&signal_handler;
sub REAPER {
while ((my $waitedpid = waitpid(-1,WNOHANG)) > 0) { }
$SIG{CHLD} = \&REAPER;
}
my $server_port = 6741;
$server= new IO::Socket::INET(LocalPort => $server_port,
TYPE => SOCK_STREAM,
Reuse => 1,
Listen => 10) or die "Couldn't be a tcp server on port $server_port: $@\n";
until($time_to_die) {
my $client;
while($client = $server->accept()) {
$SIG{CHLD} = \&REAPER;
defined(my $child_pid=fork()) or die "Can't fork new child $!";
next if $child_pid;
if($child_pid == 0) {
close($server);
}
$client->autoflush(1);
print $client "Command :";
while(<$client>) {
next unless /\S/;
my $full_enter_str = $_;
chomp($full_enter_str);
if($full_enter_str =~ /(<\w\d\d\d\w>),(\d{5}),(M|O),(\d{6}),(\d{6}),(\d{4}\.\d{4}\w),(\d{5}\.\d{4}\w),(\d{2}.\d),(\d{3}\.\d),(\d{3}\.\d),(\d),(\d{2})/) {
my $dbm = DBI->connect("DBI:mysql:database=homepage;host=127.0.0.1;port=3306", "av", "") or die "MySQL connect error";
$dbm->do("INSERT INTO `new_table` VALUES (NULL, '".$1."')");
$dbm->disconnect();
}
}
continue {
print $client "Command :";
}
exit;
}
continue {
close($client);
}
第一个问题:当我通过telnet-client发送字符串时:
<T060M>,00287,M,124427,220411,5800.1577N,04200.1038E,01.0,073.4,196.4,1,69
然后,将条目添加到数据库中。但是当端口出现类似(tcpdump)时:
0x0000: 4500 0073 0003 0000 f606 d057 d557 5cc6 E..s.......W.W\.
0x0010: c0a8 0164 dcc4 1a55 4016 741d b90a 79e4 ...d...U@.t...y.
0x0020: 5018 2c60 3b1f 0000 3c54 3036 304d 3e2c P.,`;...<T060M>,
0x0030: 3030 3238 372c 4d2c 3130 3432 3339 2c32 00287,M,104239,2
0x0040: 3430 3431 312c 3537 3434 2e35 3432 384e 40411,5744.5428N
0x0050: 2c30 3431 3030 2e34 3133 3445 2c31 312e ,04100.4134E,11.
0x0060: 302c 3030 302e 302c 3039 362e 342c 312c 0,000.0,096.4,1,
0x0070: 3646 0d 6F.
然后没有任何事情发生。
第二个问题: 过了一会儿,我看到一个足够数量的僵尸(ps ax | grep'%scriptname%'),尽管我确切知道客户端只有两个。
答案 0 :(得分:0)
关于第一件事 - 我不太确定,但你确定它与正则表达式匹配吗?您的行以6F
结尾,但正则表达式以\d{2}
结尾。它看起来不匹配。
关于第二件事,我也很感兴趣,因为收割机看起来应该有效。
编辑:AFAIK,将$SIG{CHLD}
设置为"IGNORE"
是一个更好的解决方案,因为您无论如何都不会在REAPER
函数中执行任何有用的操作。但它并不能解释为什么你的方法不起作用。