2012-11-15 116 views
2

我很新的shell脚本,我的问题是我真的不知道如何使我的套接字连接活着。 我不确定我写的脚本是否正在做它应该做的事。Shellscript发送消息到套接字并保持连接活着

我试图做的是,我相信我会创建140个套接字并向这些套接字发送消息,并且希望这些套接字连接保持活动状态。

for ((i=0; i<140; i++)) 
do 
echo "Message" > /dev/tcp/187.98.06.01/4599 
done 

有一个服务器,我发这条短信,我也得到客户端建立连接在服务器端的日志信息,但是当我检查插座连接的数量,数量为0。我我不确定是否因为套接字连接关闭。

我需要保持套接字连接活着。 任何人都可以提供上述代码的建议或修复。

回答

2

我使用GNU bash,版本3.2.25(1) - 释放(x86_64-redhat-linux-gnu)。

这并不十分安全不是非常便携,但你应该能够编写:

# Open 140 TCP connections to port 4599 on 187.98.06.01, using 
# file-descriptors 60 through 199: 
for ((i = 0 ; i < 140 ; i++)) ; do 
    fd=$((i + 60)) 
    eval exec "$fd<>/dev/tcp/187.98.06.01/4599" 
    echo Message >&$fd 
done 

# ... do whatever you want with these 140 connections ... 

# Close the connections: 
for ((i = 0 ; i < 140 ; i++)) ; do 
    fd=$((i + 60)) 
    eval exec "$fd<&-" "$fd>&-" 
done 

(它不是便携式的原因是,它取决于AREN bash特性并不是所有的shell都共享它,它不安全的原因是shell使用文件描述符作为自己内部的东西,例如打开脚本和搜索目录。描述符0到9 — STDIN,STDOUT,STDERR和另外七个—供你使用,但德脚本10以及更高的风险与shell正在做的冲突。在Bash 4.x中有一个特性,可以让你为重定向提供一个变量名称,并让Bash决定使用什么文件描述符,但Bash 3.x没有这个功能。)