多线程多 IP-portscaner 一脸萌比

2017-01-02 07:39:24 +08:00
 inksong
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 。。。我真是小白。。
3036 次点击
所在节点    Python
12 条回复
gouchaoer
2017-01-02 08:42:03 +08:00
第一,这是多进程
第二,这种情况异步 io 直接单进程完成,效率不知道高哪里去了
Allianzcortex
2017-01-02 08:45:37 +08:00
你这是多进程啊,应该用 dummy 的。
```
for p in jobs;
p.start()

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

类似这样的
inksong
2017-01-02 08:48:44 +08:00
@Allianzcortex 大神紧急求助!小弟对 python 不太熟求救,实在不太懂如何写,能再说的详细一点吗?十分感谢!
inksong
2017-01-02 08:49:53 +08:00
@gouchaoer 打错了。。十分抱歉。大神异步 io 单进程怎么搞啊,小弟刚大一,对编程还不太熟。。。能再说的详细一点吗,小弟肯定认真钻研!
Allianzcortex
2017-01-02 08:50:24 +08:00
其实我想说这种情况用 threadpoolexecutor + future 简直再合适不过了,写过一篇半成品 blog http://allianzcortex.me/2014/06/22/python-multiprocess/ 不知道有没有帮助。 @gouchaoer 说的是 asyncio ?其实没怎么用过(噗。。)
inksong
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
2017-01-02 09:51:46 +08:00
@inksong C 程序员比较喜欢 epoll
rogerchen
2017-01-02 18:12:43 +08:00
这显然是 IO bound 的情况, 1G 带宽打满也用不了一个核。。。
epoll kqueue 是正解,开几千个线程也马马虎虎吧,起那么多进程就有点浪费了。
rogerchen
2017-01-02 18:23:03 +08:00
@inksong
问代码至少要贴一下错误输出吧。
hoocok
2017-01-04 16:06:09 +08:00
V2Ex 不支持代码缩进的么??????以后直接贴代码图吧?还是 V2EX 不支持 Markdown 之类?
retanoj
2017-01-05 14:57:37 +08:00
@hoocok
v2ex 贴代码技巧里有写: https://www.v2ex.com/t/130567
hoocok
2017-01-16 22:43:52 +08:00
@retanoj 多谢

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

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

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

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

© 2021 V2EX