1

我对网络编程完全陌生,无法解决这个问题

我有一个服务器(某种 LPT 端口到 TCP/IP 代理),它会自动尝试以随机间隔建立连接。我需要监听特定端口并与服务器通信。那是客户。它适用于 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 服务器,但使用这个“黑盒” - 不,在客户端机器上有两个连接:

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

它就像一个魅力,数据在流动。并且只有一个连接存在(如第二个)

在客户端捕获的一个符号传输的 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 回答