我正在尝试使用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
接受的命令行选项似乎与您的不同。)