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
inksong
V2EX  ›  Python

多线程多 IP-portscaner 一脸萌比

  •  
  •   inksong · 2017-01-02 07:39:24 +08:00 · 2850 次点击
    这是一个创建于 2643 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import multiprocessing

    def socket_port(ip, PORT):
    global portdetaildict
    s = socket.socket()
    s.settimeout(0.1)
    if s.connect_ex((ip, PORT)) == 0:
    print ip, PORT, 'is open'
    portdetaildict[str(ip)] += str(PORT)+';'
    s.close()


    def scan(ip):
    s = socket.socket()
    s.settimeout(0.1)
    common_port_list = [80, 443, 8080]#这里可以扩展成 200 个常用端口
    for port in common_port_list:
    thread.start_new_thread(socket_port, (ip, int(port)))

    def worker(q):
    while not q.empty():
    ip = q.get()
    try:
    scan(ip)
    finally:
    q.task_done()

    if __name__ == '__main__':
    q = multiprocessing.JoinableQueue()
    iplines = linecache.getlines('../test.iplist')
    timestart = time.time()
    for oneip in iplines:
    print oneip
    thisip = str(oneip).strip()
    map(q.put, thisip)

    jobs = [multiprocessing.Process(target=worker, args=(q,)) for i in xrange(100)]
    map(lambda x:x.start(),jobs)

    #想写个能快速扫完指定 iplist 里所有 ip 的指定若干端口是否开放的多线程 py ,我知道倒数第二行有问题不太知道如何把 ip 传进去。。 help 。。。我真是小白。。
    12 条回复    2017-01-16 22:43:52 +08:00
    gouchaoer
        1
    gouchaoer  
       2017-01-02 08:42:03 +08:00 via Android
    第一,这是多进程
    第二,这种情况异步 io 直接单进程完成,效率不知道高哪里去了
    Allianzcortex
        2
    Allianzcortex  
       2017-01-02 08:45:37 +08:00 via iPhone
    你这是多进程啊,应该用 dummy 的。
    ```
    for p in jobs;
    p.start()

    q.join()
    for p in jobs:
    p.join()
    ```

    类似这样的
    inksong
        3
    inksong  
    OP
       2017-01-02 08:48:44 +08:00
    @Allianzcortex 大神紧急求助!小弟对 python 不太熟求救,实在不太懂如何写,能再说的详细一点吗?十分感谢!
    inksong
        4
    inksong  
    OP
       2017-01-02 08:49:53 +08:00
    @gouchaoer 打错了。。十分抱歉。大神异步 io 单进程怎么搞啊,小弟刚大一,对编程还不太熟。。。能再说的详细一点吗,小弟肯定认真钻研!
    Allianzcortex
        5
    Allianzcortex  
       2017-01-02 08:50:24 +08:00 via iPhone
    其实我想说这种情况用 threadpoolexecutor + future 简直再合适不过了,写过一篇半成品 blog http://allianzcortex.me/2014/06/22/python-multiprocess/ 不知道有没有帮助。 @gouchaoer 说的是 asyncio ?其实没怎么用过(噗。。)
    inksong
        6
    inksong  
    OP
       2017-01-02 08:56:48 +08:00
    @Allianzcortex 额我只想用一个 JoinableQueue 来解决问题,我这个代码现在唯一的问题就是
    jobs = [multiprocessing.Process(target=worker, args=(q,)) for i in xrange(100)]
    这句里 q 的赋值我没太搞懂,我想把 iplist 赋值进去好让它一个一个处理,对 python 语法不熟。。。求点拨!
    jimzhong
        7
    jimzhong  
       2017-01-02 09:51:46 +08:00
    @inksong C 程序员比较喜欢 epoll
    rogerchen
        8
    rogerchen  
       2017-01-02 18:12:43 +08:00
    这显然是 IO bound 的情况, 1G 带宽打满也用不了一个核。。。
    epoll kqueue 是正解,开几千个线程也马马虎虎吧,起那么多进程就有点浪费了。
    rogerchen
        9
    rogerchen  
       2017-01-02 18:23:03 +08:00
    @inksong
    问代码至少要贴一下错误输出吧。
    hoocok
        10
    hoocok  
       2017-01-04 16:06:09 +08:00
    V2Ex 不支持代码缩进的么??????以后直接贴代码图吧?还是 V2EX 不支持 Markdown 之类?
    retanoj
        11
    retanoj  
       2017-01-05 14:57:37 +08:00
    @hoocok
    v2ex 贴代码技巧里有写: https://www.v2ex.com/t/130567
    hoocok
        12
    hoocok  
       2017-01-16 22:43:52 +08:00
    @retanoj 多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5337 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:09 · PVG 16:09 · LAX 01:09 · JFK 04:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.