2013-03-01 23 views
1

我完全新的.NET編程並不能解決這個問題perl的TCP客戶端不顯示輸入的數據

我有一臺服務器(某種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服務器OK,但這個「黑匣子」 - 沒了 在客戶端機器有兩個連接:

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 

我不知道我做錯了什麼......更復雜的例子不工作對我來說,因爲我不知道如何調試他們...

+0

患有緩衝嗎?如果你添加'$ | = 1;'? – ikegami 2013-03-01 18:26:38

+0

沒有兩個連接,順便說一句。只有第二個連接。有一個偵聽服務器套接字('$ sock')和一個連接的客戶端套接字('$ new_sock'),這非常好。 – ikegami 2013-03-01 18:34:23

+0

$ | = 1;添加後使用...沒有訣竅...服務器發送ascii字符...應該工作... – pugnator 2013-03-01 18:59:25

回答

2

<$new_sock>readline($new_sock)的縮寫,僅在收到完整的行後才返回,也就是說收到換行符時。

sysread將盡快返回數據可用,所以你可以使用它。

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

另外,由於您接收到的行以回車結束,因此您可以將此通知給Perl。

$/ = "\r"; 
+0

非常感謝這個解決方案! – pugnator 2013-03-01 20:23:01

+0

我想說明的是,限制['$ /'](http://perldoc.perl.org/perlvar.html#%24%2f「perldoc -v' $ /'「)。 – 2013-03-02 17:59:49