使用NetCat处理数据包丢失,Linux中的外壳脚本



我正在尝试使用UNIX中的NC命令通过行中的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

我怀疑您正在丢失数据包。

当您在外壳中执行"读取"one_answers" echo"时,它会掉落空格并巧妙地更改您的文件,因此我建议我一次执行" 1个文件",而不是一次" 1行"避免"读"one_answers"回声"。这样:

服务器:

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

编辑如果要测试数据包是否被删除,请尝试发送大量数据,并查看是否到达与发送的数量相同:

客户端:

#!/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 $_; }
}

您可以尝试添加[x]基于Inetd的服务,看看是否有帮助:

edit/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

(我不能说您对 nc -l的用法非常好;也许只能作为快速&amp; dirty hack接受。)

您的问题在技术上与数据包丢失不同。

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接受的命令行选项似乎与您的不同。)

最新更新