python|python 脚本检测dns时延
由于实验原因需要查询各地的dns时延,所以我参考了网上的各类代码,写了一个dns时延检测的脚本,希望朋友们指导。
-*- coding:utf-8 -*-
from timeit import timeit
import time
import socket
global msg
def send():
q = msg
sock_recv = 0
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.sendto(q, ('8.8.8.8', 53))
sock_recv = sock.recv(4096)
while sock_recv != 0:
breakfor num in range(10):
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x05baidu\x03com\x00\x00\x01\x00\x01'
#msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x02qq\x03com\x00\x00\x01\x00\x01'
t = timeit('send()', 'from __main__ import send', number=1)
print t
使用了python中的socket库,这个库中可以实现发包的功能,这里面我们是将包发送的谷歌的dns服务器8.8.8.8的53端口,然后通过一个计时器函数来判断这个函数是否结束,即是否收到了返回的包,来计算dns时延,这种检测方法,要比通过wireshark抓包有更大的延迟,在我的机器上测试延迟是几毫秒,所以就忽略掉了。
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x05baidu\x03com\x00\x00\x01\x00\x01'
msg的内容就是我们要发送的内容,可以任意更换地址,但是要注意
x03www\x05baidu\x03com\
简单的说,就是前面数是代表了后面包含几个字母,其他各个位置都可以通过wireshark抓包来分析。
之后为了便于运行,我会从记事本中读取url,然后将结果输出在一个文件中。
# -*- coding:utf-8 -*-
import socket
import csv
import sys
from timeit import timeit
class Logger(object):
def __init__(self, fileN="Default.log"):
self.terminal = sys.stdout
self.log = open(fileN, "a")def write(self, message):
self.terminal.write(message)
self.log.write(message)def flush(self):
pass
def send():
sock_recv = 0
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.sendto(msg, ('114.114.114.114', 53))
sock_recv = sock.recv(4096)
while sock_recv != 0:
breakdef getlineNum():
f = open(u"website.txt", 'r')
content = csv.reader(f)
lineNum = 0
for line in content:
lineNum += 1
f.close()
return (lineNum)# lineNum就是你要的文件行数
def creatXC():
f = open(u"website.txt", 'r')
for i in range(0,10):
line = f.readline()
print(line)
split1(line)def split1(line):
global msg
st1 = line.split('.')
num = len(st1[1])
if num == 2:
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x02%s\x03com\x00\x00\x01\x00\x01' % (st1[0], st1[1])
for i in range(11):
t = timeit('send()', 'from __main__ import send', number=1)
print(t)
if num == 3:
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x03%s\x03com\x00\x00\x01\x00\x01' % (
st1[0], st1[1])
for i in range(11):
t = timeit('send()', 'from __main__ import send', number=1)
print(t)
if num == 4:
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x04%s\x03com\x00\x00\x01\x00\x01' % (
st1[0], st1[1])
for i in range(11):
t = timeit('send()', 'from __main__ import send', number=1)
print(t)
if num == 5:
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x05%s\x03com\x00\x00\x01\x00\x01' % (
st1[0], st1[1],)
for i in range(11):
t = timeit('send()', 'from __main__ import send', number=1)
print(t)
if num == 6:
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x06%s\x03com\x00\x00\x01\x00\x01' % (
st1[0], st1[1])
for i in range(11):
t = timeit('send()', 'from __main__ import send', number=1)
print(t)
if num == 7:
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x07%s\x03com\x00\x00\x01\x00\x01' % (
st1[0], st1[1])
for i in range(11):
t = timeit('send()', 'from __main__ import send', number=1)
print(t)
if num == 8:
msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x08%s\x03com\x00\x00\x01\x00\x01' % (
st1[0], st1[1])
for i in range(11):
t = timeit('send()', 'from __main__ import send', number=1)
print(t)sys.stdout = Logger(u"output.txt")
creatXC()
Github代码链接
【python|python 脚本检测dns时延】https://github.com/Promise123/dns/tree/master/dns
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- Java|Java OpenCV图像处理之SIFT角点检测详解
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则