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