Форум сайта python.su
Всем привет,
1) подскажите возможно ли на питоне получить шлюз по умолчанию?
Пока вижу только решение - запускать процесс
cmd /c "route print"
Офлайн
про пинг вот тема http://python.su/forum/viewtopic.php?id=30
Офлайн
Присоединяюсь к вопросу насчет tracert. На днях пытался искать. Был один пример, но под виндой не завелся. Хотелось бы pure python :)
Офлайн
здесь есть рабочий traceroute:
http://pypi.python.org/pypi/pyip/0.7
Офлайн
truporezЗапустил питоновский tracert:
здесь есть рабочий traceroute:
http://pypi.python.org/pypi/pyip/0.7
C:\temp\pyip-0.7>traceroute.py 192.168.0.1
traceroute to HOME-S (192.168.0.1), 30 hops max, 38 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
C:\Documents and Settings\user>tracert 192.168.0.1
Трассировка маршрута к 192.168.0.1 с максимальным числом прыжков 30
1 <1 мс <1 мс <1 мс 192.168.0.1
Трассировка завершена.
C:\Documents and Settings\user>
Отредактировано (Май 20, 2009 20:41:04)
Офлайн
для наглядности лучше цель выбрать подальше. а то что трассировать не прекращает - надо код смотреть. почему-то не срабатывает icmp_reply.get_type() == icmp.ICMP_UNREACH.
получить список хостов - как вариант в месте отладки вместо print влепить добавление к списку. и по окончанию трассировки его возвращать.
Офлайн
Всем привет,
у меня ping из пакета pyip (http://pypi.python.org/pypi/pyip/0.7) вызывал exception в случае когда ни одного пакета не дошло до хоста! Проблема возникала потому, что автор пытался расчитать min, max, avg в случае когда ни один пакет не дошел.
Я немного переправил код процедуры get_summary.
Мой рабочий код
def get_summary(self):
if len(self.deltas) > 0 :
dmin = min(self.deltas)
dmax = max(self.deltas)
davg = reduce(lambda x, y: x + y, self.deltas) / len(self.deltas)
else :
dmin = dmax = davg = '-'
sent = self.num
recv = sent - len(self.times.values())
loss = float(sent - recv) / float(sent)
return dmin, davg, dmax, sent, recv, loss
def get_summary(self):
dmin = min(self.deltas)
dmax = max(self.deltas)
davg = reduce(lambda x, y: x + y, self.deltas) / len(self.deltas)
sent = self.num
recv = sent - len(self.times.values())
loss = float(sent - recv) / float(sent)
return dmin, davg, dmax, sent, recv, loss
if __name__ == "__main__":
try:
who = sys.argv[1]
except IndexError:
print "ping.py host [#packets]"
sys.exit(0)
try:
num = string.atoi(sys.argv[2])
except ValueError:
print "ping.py host [#packets]"
sys.exit(0)
except IndexError:
num = 32
p = CmdlinePinger(who, num)
p.ping()
summary = p.get_summary()
print "---Ping statistics---"
lost_packet_percent = int(summary[5] * 100.)
print "%d packets transmitted, %d packets received, %d%% packet loss" % \
(summary[3], summary[4], lost_packet_percent)
if lost_packet_percent < 100 :
print "round-trip (ms) min/avg/max = %d/%d/%d" % \
(summary[0], summary[1], summary[2])
if __name__ == "__main__":
try:
who = sys.argv[1]
except IndexError:
print "ping.py host [#packets]"
sys.exit(0)
try:
num = string.atoi(sys.argv[2])
except ValueError:
print "ping.py host [#packets]"
sys.exit(0)
except IndexError:
num = 32
p = CmdlinePinger(who, num)
p.ping()
summary = p.get_summary()
print "---Ping statistics---"
print "%d packets transmitted, %d packets received, %d%% packet loss" % \
(summary[3], summary[4], int(summary[5] * 100.))
print "round-trip (ms) min/avg/max = %d/%d/%d" % \
(summary[0], summary[1], summary[2])
Отредактировано (Май 29, 2009 06:40:01)
Офлайн
Весь код
#
# pyip is a Python package offering assembling/disassembling of raw ip packet
# including ip, udp, and icmp. Also it includes 2 utilities based on raw ip,
# traceroute and ping.
#
# pyip is released under PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2, and is
# a project inspired by 'ping' written by Jeremy Hylton.
#
# Author: Kenneth Jiang, kenneth.jiang@gmail.com
#
"""Ping. Round-trip delay measurement utility.
Uses ICMP ECHO_REQEST messages to measure the delay between two
Internet hosts.
"""
import icmp, ip
import socket
import time
import select
import string
import os, sys
TimedOut = 'TimedOut'
class PingSocket:
def __init__(self, addr):
self.dest = (socket.gethostbyname(addr), 0)
self.open_icmp_socket()
def open_icmp_socket(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_RAW,
socket.IPPROTO_ICMP)
self.socket.setblocking(1)
def sendto(self, packet):
self.socket.sendto(packet, self.dest)
def recvfrom(self, maxbytes):
return self.socket.recvfrom(maxbytes)
class Pinger:
def __init__(self, addr, num):
self.num = num
self.last = 0
self.sent = 0
self.times = {}
self.deltas = []
self.sock = PingSocket(addr)
self.pid = os.getpid()
self.addr = addr
name, aliases, ipaddr = socket.gethostbyaddr(addr)
if aliases:
self.destinfo = (aliases[0], ipaddr[0])
else:
self.destinfo = (name, ipaddr[0])
def send_packet(self):
pkt = icmp.Echo(id=self.pid, seq=self.sent, data='python pinger')
buf = icmp.assemble(pkt)
self.times[self.sent] = time.time()
self.sock.sendto(buf)
self.plen = len(buf)
self.sent = self.sent + 1
def recv_packet(self, pkt, when):
try:
sent = self.times[pkt.get_seq()]
del self.times[pkt.get_seq()]
except KeyError:
return
# limit to ms precision
delta = int((when - sent) * 1000.)
self.deltas.append(delta)
self.recv_output(self.plen, self.destinfo[0],
self.destinfo[1], pkt.get_seq(), delta)
if pkt.get_seq() > self.last:
self.last = pkt.get_seq()
def recv_output(self, bytes, dest, addr, seq, delta):
"Place holder for subclass output/collector method"
pass
def ping(self):
# don't wait more than 10 seconds from now for first reply
self.last_arrival = time.time()
while 1:
if self.sent < self.num:
self.send_packet()
elif not self.times and self.last == self.num - 1:
break
else:
now = time.time()
if self.deltas:
# Wait no more than 10 times the longest delay so far
if (now - self.last_arrival) > max(self.deltas) / 100.:
break
else:
# Wait no more than 10 seconds
if (now - self.last_arrival) > 10.:
break
self.wait()
def wait(self):
start = time.time()
timeout = 1.0
while 1:
rd, wt, er = select.select([self.sock.socket], [], [], timeout)
if rd:
# okay to use time here, because select has told us
# there is data and we don't care to measure the time
# it takes the system to give us the packet.
arrival = time.time()
try:
pkt, who = self.sock.recvfrom(4096)
except socket.error:
continue
# could also use the ip module to get the payload
repip = ip.disassemble(pkt)
try:
reply = icmp.disassemble(repip.data)
except ValueError:
continue
if reply.get_id() == self.pid:
self.recv_packet(reply, arrival)
self.last_arrival = arrival
timeout = (start + 1.0) - time.time()
if timeout < 0:
break
def get_summary(self):
if len(self.deltas) > 0 :
dmin = min(self.deltas)
dmax = max(self.deltas)
davg = reduce(lambda x, y: x + y, self.deltas) / len(self.deltas)
else :
dmin = dmax = davg = '-'
sent = self.num
recv = sent - len(self.times.values())
loss = float(sent - recv) / float(sent)
return dmin, davg, dmax, sent, recv, loss
class CollectorPinger(Pinger):
def __init__(self, host, num):
Pinger.__init__(self, host, num)
self.results = {}
def recv_output(self, bytes, dest, addr, seq, delta):
self.results[seq] = delta
class CmdlinePinger(Pinger):
def recv_output(self, bytes, dest, addr, seq, delta):
print "%d bytes from %s (%s): icmp_seq=%d. time=%d. ms" % \
(bytes, dest, addr, seq, delta)
def ping(self):
print "PING %s" % self.destinfo[0]
Pinger.ping(self)
if __name__ == "__main__":
try:
who = sys.argv[1]
except IndexError:
print "ping.py host [#packets]"
sys.exit(0)
try:
num = string.atoi(sys.argv[2])
except ValueError:
print "ping.py host [#packets]"
sys.exit(0)
except IndexError:
num = 32
p = CmdlinePinger(who, num)
p.ping()
summary = p.get_summary()
print "---Ping statistics---"
lost_packet_percent = int(summary[5] * 100.)
print "%d packets transmitted, %d packets received, %d%% packet loss" % \
(summary[3], summary[4], lost_packet_percent)
if lost_packet_percent < 100 :
print "round-trip (ms) min/avg/max = %d/%d/%d" % \
(summary[0], summary[1], summary[2])
Офлайн
qmanПоидее в self.deltas храняться числа. Как-то это не айс так делать. Никогда не смешивай данные и отображение. Лучше приравняй к нулю или None (как будет логичнее?), а потом обработай вывод. А то я хочу получить в программе эти значения, а получаю строку… Не логично. да и не корректно.
dmin = dmax = davg = ‘-’
qmanИМХО, если уж делать вывод, то в таком виде:
А также изменил код вывода статистика пинга.
Last login: Fri May 29 09:56:44 on console
ttys000 /Users/zzz $ ping -i10 -c6 72.14.205.100
PING 72.14.205.100 (72.14.205.100): 56 data bytes
64 bytes from 72.14.205.100: icmp_seq=0 ttl=239 time=895.480 ms
64 bytes from 72.14.205.100: icmp_seq=1 ttl=239 time=1344.195 ms
64 bytes from 72.14.205.100: icmp_seq=2 ttl=239 time=1160.868 ms
64 bytes from 72.14.205.100: icmp_seq=3 ttl=239 time=1517.706 ms
64 bytes from 72.14.205.100: icmp_seq=4 ttl=239 time=941.263 ms
64 bytes from 72.14.205.100: icmp_seq=5 ttl=239 time=1081.249 ms
— 72.14.205.100 ping statistics —
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max/stddev = 895.480/1156.793/1517.706/218.265 ms
ttys000 /Users/zzz $
qmanСловарик в зубы и пиши автору письмо. А то если бы каждый мог сам что угодно поправить, начился бы хаос.
подскажите как обновить этот код на сайте
Отредактировано (Май 29, 2009 09:36:56)
Офлайн
Друзья, прошу помощи.
Стабильно не открываются определенные сайты. Попробовал их протрейсить.
Tracert c первого хопа выводит звездочки. Фаерволов нет. Проблема возникла после завирусовки компа. Вирусы вычистил, но проблема осталась. Где искать причину? Как исправить?
Заранее всем спасибо.
Офлайн