1

私はネットプログラミングにまったく慣れていないので、この問題を解決できません

ランダムな間隔で自動的に接続を確立しようとするサーバー (TCP/IP プロキシへのある種の LPT ポート) があります。特定のポートでリッスンし、サーバーと通信する必要があります。それがクライアントです。perl tcp サーバーで問題なく動作します..しかし、この場合は待機します....何も起こりません

#!/usr/bin/perl -w
use IO::Socket;
my $sock = new IO::Socket::INET(
    LocalHost => '192.168.1.1',
    LocalPort => '7000',
    Proto     => 'tcp',
    Listen    => 1,
    Reuse     => 1,
);
die "Could not create socket: $!\n" unless $sock;
my $new_sock = $sock->accept();
while (<$new_sock>) {
    print $_;
}
close($sock);

私の単純な tcp サーバーでは問題なく動作しますが、この「ブラック ボックス」では問題ありません。クライアント マシンには 2 つの接続があります。

tcp        0      0 192.168.1.1:7000      0.0.0.0:*               LISTEN     
tcp        0      0 192.168.1.1:7000      192.168.1.2:33822     ESTABLISHED

しかし、私が試してみると

nc -l 192.168.1.1 7000

それは魅力のように機能し、データは流れています。そして、1つの接続のみが存在します(2番目の接続のように)

クライアントでキャプチャされた 1 つのシンボル送信の tcpdump フラグメント。大丈夫そうです

21:42:00.242172 IP (tos 0x0, ttl 64, id 30448, offset 0, flags [DF], proto TCP (6), length 53)
192.168.1.2.33837 > 192.168.1.1.7000: Flags [P.], cksum 0x5646 (correct), seq 3592562130:3592562131, ack 1351632513, win 92, options [nop,nop,TS val 140364552 ecr 92554083], length 1

何が間違っているのかわかりません...デバッグ方法がわからないため、より複雑な例は機能しません...

4

1 に答える 1

2

<$new_sock>、の略でreadline($new_sock)、完全な行が受信された後、つまり改行が受信されたときにのみ返されます。

sysreadデータが利用可能になるとすぐに返されるので、それを使用できます。

my $rv = sysread($new_sock, my $buf, 64*1024);

あるいは、受け取った行は改行で終わっているので、これを Perl に伝えることができます。

$/ = "\r";
于 2013-03-01T19:54:17.490 に答える