蛙蛙推荐:gevent并发发送UDP包演示
gevent是一个非常棒的python异步IO库,一般的示例都是用他来做高并发的tcp server,其实它也能很好的工作在udp上,而且超时,并发数都能很好的控制。
#!/usr/bin/env python
#-*- coding:utf8 -*-
import DNS #http://pydns.sourceforge.net/
from gevent import spawn, joinall,socket,sleep
from gevent.coros import BoundedSemaphore
from datetime import datetime
import random
DNS.ParseResolvConf()
SERVER = (DNS.defaults['server'][0],53)
SERVER = ('8.8.8.8',53) #临时使用google的dns
TIMEOUT = 10
lock = BoundedSemaphore(50) #并发数限制,防止同时pending的请求太多
statis = {} #统计信息
def log(domain,status,responsetime):
statis.setdefault(status, 0)
statis[status] += 1
print '%s %s %s' % (domain, status, responsetime)
def getreq(domain, qtype):
'根据域名和查询类型得到dns请求的字节流'
m = DNS.Lib.Mpacker()
m.addHeader(id=random.randint(0,65535),
qr=0,
opcode=0,
aa=0,
tc=0,
rd=1,
ra=0,
z=0,
rcode=0,
qdcount=1,
ancount=0,
nscount=0,
arcount=0)
m.addQuestion(domain, qtype, DNS.Class.IN)
return m.getbuf()
def monitorone(domain):
try:
lock.acquire()
start = datetime.now()
client = socket.socket(
family=socket.AF_INET,
type=socket.SOCK_DGRAM,
proto=socket.IPPROTO_UDP)
client.settimeout(TIMEOUT)
req = getreq(domain, DNS.Type.MX) #封包
client.sendto(req, SERVER) #发包
(rsp, (ip, port)) = client.recvfrom(512) #收包
u = DNS.Lib.Munpacker(rsp) #解包
rsp = DNS.Lib.DnsResult(u, {})
end = datetime.now()
responsetime = (end - start).microseconds
log(domain, rsp.header['status'], responsetime)
except Exception, ex:
log(domain, ex.message, 0)
finally:
lock.release()
#加载域名列表并解析
list = [spawn(monitorone, domain.strip())
for domain in open('./domains.txt')]
joinall(list)
global statis
print statis
以上代码是从一个文本里加载一个域名列表,然后以50并发的速度去google dns查询DNS应答,记录应答状态码和响应时间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构