使用Linux中的netcat,shell脚本处理数据包丢失

时间:2014-02-05 10:27:34

标签: linux shell sockets tcp

我正在尝试使用unix中的nc命令逐行将文件内容发送到服务器正在侦听进行进一步处理的端口。

我使用以下代码:

客户端:

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

3 个答案:

答案 0 :(得分:0)

我怀疑你丢包了。

当你在shell中执行“read”和“echo”时,它会丢弃空白并巧妙地更改你的文件,因此我建议一次“1个文件”,而不是“一次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 $_; }
}

答案 1 :(得分: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 / receiver的shell脚本,它从stdin读取消息并按照这些行做任何你想做的事情

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

答案 2 :(得分: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接受的命令行选项似乎与您的不同。)