我有一些正在测试的代码。程序 A 侦听预定义的套接字以供程序 B 连接,并且为了进行测试,我正在运行程序 A 和 B 的 32 个实例。我编写了脚本来告诉程序 A 侦听端口 9001-9032 并输入程序 B 的每个实例的配置文件与要连接的相应端口。
当我运行启动程序 A 和 B 的脚本并运行时,netstat -tnap
我发现在所有端口 9001-9032 中,实际使用的唯一端口是 9001,它被另一个程序使用(我的错误!)。当我 grep 查找程序 A 时,我发现每个实例都在监听看似完全随机的端口,这些端口与它们应该监听的端口 90** 没有关系。然而,我的程序 B(应该连接到端口 9001-9032)能够找到并连接到程序 A 的每个实例,尽管 A 显然没有监听 B 应该尝试连接的端口。我很困惑这怎么可能。
如果这还不够混乱我的 32 程序和仅有的32 号(侦听 9032)在启动时死亡,并出现错误:当它尝试绑定到端口时,地址被拒绝。我尝试更改程序以侦听端口 15001-15032,只是为了看看会发生什么,但我仍然得到完全相同的行为;所有程序似乎都在随机端口上侦听,并且 32 程序无法建立连接。
谁能解释为什么我的端口表现得如此?我是否误解了 netstat 或 Linux ports 的某些部分?
答案1
我建议使用socat
(建立任意字节流的命令行工具)模拟据称断开的连接。
尝试用以下命令监听端口
socat - TCP-Listen:9001
对于侦听端口 9001 的 TCP 连接或
socat - UDP-Listen:9001
用于 udp 连接。
检查是否netstat -p
(或sockstat
)显示已建立的连接socat
。如果是这样,您应该进一步研究您的代码,并可能在以下位置发布与源代码相关的问题:stackoverflow.com。
如果是其他情况,请告知我们!