2014-02-05 56 views
0

我試圖在unix中一行一行地使用nc命令將文件內容發送到服務器正在偵聽進一步處理的端口。在Linux下使用netcat處理數據包丟失,shell腳本

我使用下面的代碼:

客戶:

for inFile in `ls /home/dbadmin/input_data/*.dat` 
do 
        while read line 
        do 
                echo $line 
                echo $line |nc -C 127.0.0.1 7870 
        done<$inFile 
done 

服務器:

echo "socket program" 
while true 
do 
    echo `nc -l 7870` 
done 

我有75線在發送端的文件中,但我在接收器端只能獲得60行的 。你們能幫我解決這個問題嗎?

更新的代碼來檢查數字,而不是文件中讀取

#!/bin/bash 
c=1 
while [ $c -le 10 ] 
do 
        echo "Welcone $c times" 
        echo $c |nc -C 127.0.0.1 7870 
        ((c++)) 
done 

回答

0

我懷疑你丟失數據包。

當您在shell中執行「讀取」和「回顯」時,它會刪除空格並巧妙地更改文件,因此我建議一次執行「1個文件」,而不是「一次一行」並避免「閱讀」和「回聲」。就像這樣:

服務器:

echo "socket program" 
while true 
do 
    nc -l 7870 
done 

客戶:

#!/bin/bash 
for inFile in *.dat 
do 
    nc -C 127.0.0.1 7870 < $inFile 
done 

EDITED 如果你想測試包是否被越來越下降了,嘗試發送大量數據,看是否發送的金額相同:

客戶端:

#!/bin/bash 
# Send 1GB of zeroes 
dd if=/dev/zero bs=1m count=1000 |nc -C 127.0.0.1 7870 

輸出示例:

1000+0 records in 
1000+0 records out 
1048576000 bytes transferred in 6.618385 secs (158433821 bytes/sec) 

服務器:

echo "socket program" 
while true 
do 
    # Receive stuff and say how much 
    nc -l 7870 | wc -c 
done 

輸出示例:

1048576000 

我在想,如果這個問題可能是netcat的沒有設置SO_REUSEADDR以允許地址被重新使用。你可以讓客戶原樣,並嘗試以此爲Perl實現的服務器,並看看是否有幫助?

#!/usr/bin/perl 

use IO::Socket; 
my $sock = new IO::Socket::INET ( 
    LocalPort => '7870', 
    Proto => 'tcp', 
    Listen => 1, 
    Reuse => 1, 
); 

die "Could not create socket: $!\n" unless $sock; 

while(my $new_sock = $sock->accept()){ 
    while(<$new_sock>) { print $_; } 
} 
+0

嗨,馬克,感謝您的建議。 我需要逐行發送,所以我添加了上面的代碼,這是發送10個數字,我只有8個數字。剩下的2個數字丟失了。 – user4k

+0

當你改變它會發生什麼? –

+0

嗨,馬克,我可以看到上面提到的相同輸出。 這是我需要逐行發送的示例文件。類似的方式我有n個數字文件。 http://dpaste.com/hold/1586897/ 注意:我不想發送整個文件,Actuall我需要逐行發送。爲什麼,因爲我已經有了另一個腳本,它正在做一些處理,它會寫入文件。我只想鏈接腳本的輸出以發送流中的每個值 – user4k

0

你可以嘗試添加[X]基於inetd的服務,並看看是否有幫助:

編輯/ etc/inetd。CONF

添加一行:

7870 stream tcp nowait root /usr/sbin/tcpd /home/youruser/bin/receiver 

重新初始化inetd的,像這樣

sudo pkill -HUP inetd 

寫所謂的/ home/youruser/bin中一個shell腳本/接收器,讀取郵件從它的stdin,並沿着這些行做任何你想要的東西

#!/bin/bash 
cat - >> /tmp/log.txt 
0

(我不能說你的用法nc -l非常好;也許這只是作爲一個快速的&骯髒的黑客可以接受。)

你的問題在技術上與數據包丟失不同。

while true 
do 
    echo `nc -l 7870` 
done 

當這個循環,會有很短的時間週期時nc沒有偵聽7870/TCP。然後,發件人nc將無法​​建立連接並返回錯誤,導致信息丟失。

這是如何重試發送相同的數據,直到nc成功返回。

while read line; do 
    echo $line 
    while ! echo $line | nc -q0 localhost 33445; do : ; done 
done < /etc/fstab 

(請注意,我nc接受的命令行選項似乎是從你的不同)。