2

我对 shell 脚本很陌生,我的问题是我不太确定如何使我的套接字连接有效。我不确定我编写的脚本是否在做它应该做的事情。

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

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

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

我需要保持套接字连接处于活动状态。任何人都可以为上述代码提供建议或修复。

4

1 回答 1

2

我使用 GNU bash,版本 3.2.25(1)-release (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

(它不可移植的原因是它依赖于并非由所有 shell 共享的 Bash 功能。它不安全的原因是 shell 将文件描述符用于其自己的内部内容,例如打开脚本和搜索目录。描述符 0到 9 — STDIN、STDOUT、STDERR 和其他七个 — 供您使用,但描述符 10 和更高的风险与 shell 正在执行的操作冲突。在 Bash 4.x 中有一个功能可以让您提供变量名重定向并让 Bash 决定使用什么文件描述符,但 Bash 3.x 没有。)

于 2012-11-16T14:05:23.717 回答