请问大佬们 socket 如何判断 udp 端口状态

2018-11-29 17:39:32 +08:00
 javashell

想用 socket 检测局域网中的 udp 端口开放状态,如何才能正确的判断端口是否开放?

3161 次点击
所在节点    Python
16 条回复
305835227fadf
2018-11-29 17:44:05 +08:00
为什么要自己总爱造轮子? python 有 nmap 的库可用
javashell
2018-11-29 17:49:21 +08:00
@305835227fadf nmap 感觉太慢
305835227fadf
2018-11-29 17:52:30 +08:00
@javashell 探测端口是网络 IO 密集型任务,如果你有多个探测目标这时候多线程是很好的解决方法,当然也有更高级的方案。
javashell
2018-11-29 17:54:55 +08:00
@305835227fadf 求更高级的方案
305835227fadf
2018-11-29 17:59:23 +08:00
更高级的方案并不会给你的单次执行带来更大效率的提升( IO 开销无法避免),这种监控类的应用是性能无关的。其实对于一般的探测类应该用多线程的方式已经可以很好的解决你的问题了。不知道你的具体场景是什么?
javashell
2018-11-29 18:03:33 +08:00
@305835227fadf 需要对局域网中几百台机器全端口扫描,查看是否有 udp 端口开放,开放则记录下来
305835227fadf
2018-11-29 18:07:42 +08:00
@javashell 首先你的这种需求很普通,普通到写个 shell 脚本调 system 命令也可以干,而且几百台机器真不多,也花费不了多长的时间,我还以为你全国上万节点周期性探测呢,放心你随便搞。
sigup
2018-11-29 18:12:07 +08:00
去看 ZMap 源码
With a 10gigE connection and PF_RING, ZMap can scan the IPv4 address space in under 5 minutes.
ysc3839
2018-11-29 18:22:40 +08:00
UDP 端口没法检测是否开放吧?你发数据过去,对方可以不回复的。
ChrisTsai
2018-11-29 18:36:16 +08:00
UDP 端口也能检测?
javashell
2018-11-29 19:16:06 +08:00
@ysc3839 @ChrisTsai nmap 都可以啊
ChrisTsai
2018-11-29 19:20:54 +08:00
@javashell #11 好吧,查了一下,是用的 icmp 方式,确实可以
mansurx
2018-11-29 19:22:39 +08:00
@ysc3839 #9
@ChrisTsai #10
@javashell #11
UDP 端口是这样的:如果你给一个 UDP 端口发包,对方主机没有监听这个端口,那么这个主机会给你回复一个特殊类型的 ICMP 不可达;如果端口是开放的,那么就没有任何回应。

所以,要检测的端口是监听状态的话,本机要等待一定的时间,确保对方没有回复信息才行。
lopetver
2018-11-30 08:35:55 +08:00
@ChrisTsai NC 也是可以的
nanlou
2018-11-30 10:02:45 +08:00
icmp port unreachable
julyclyde
2018-11-30 10:40:32 +08:00
什么叫“开放”?你得先定义这个说法到底是什么意思

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/512808

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX