V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
javashell
V2EX  ›  Python

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

  •  
  •   javashell · 2018-11-29 17:39:32 +08:00 via Android · 3160 次点击
    这是一个创建于 2184 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    所以,要检测的端口是监听状态的话,本机要等待一定的时间,确保对方没有回复信息才行。
    lopetver
        14
    lopetver  
       2018-11-30 08:35:55 +08:00
    @ChrisTsai NC 也是可以的
    nanlou
        15
    nanlou  
       2018-11-30 10:02:45 +08:00
    icmp port unreachable
    julyclyde
        16
    julyclyde  
       2018-11-30 10:40:32 +08:00
    什么叫“开放”?你得先定义这个说法到底是什么意思
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3414 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:42 · PVG 12:42 · LAX 20:42 · JFK 23:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.