Я использую jedie's python ping
реализацию в Windows. Я могу ошибаться, но при пинге двух компьютеров (A и B) из отдельных потоков ping вернет первый полученный пинг, независимо от источника.
Поскольку это может быть проблема с вилкой джедая, я вернулась к предыдущей версии . (Это версия, которую я собираюсь изучить ниже)
Я добавил строку кода в receive_one_ping
: (строка 134 или аналогичная)
recPacket, addr = my_socket.recvfrom(1024) # Existing line
print "dest: {}, recv addr: {}.".format(dest_addr, addr) # New line
Это позволяет нам увидеть адрес получаемого нами пинга. (Должен быть таким же, как и IP-адрес назначения, верно?)
Тестирование:
ping1 () проверяет связь с известным автономным IP-адресом (1.2.3.4),
ping2 () пингует известный IP-адрес в сети (192.168.1.1 - мой маршрутизатор)
>>> from ping import do_one
>>> def ping1():
print "Offline:", do_one("1.2.3.4",1)
>>> ping1()
Offline: None
>>> def ping2():
print "Online:", do_one("192.168.1.1",1)
>>> ping2()
Online: dest: 192.168.1.1, recv addr: ('192.168.1.1', 0).
0.000403682590942
Теперь, если мы сделаем их вместе: (Для простоты используем таймер)
>>> from threading import Timer
>>> t1 = Timer(1, ping1)
>>> t2 = Timer(1, ping2)
>>> t1.start(); t2.start()
>>> Offline:Online: dest: 192.168.1.1, recv addr: ('192.168.1.1', 0).dest: 1.2.3.4, recv addr: ('192.168.1.1', 0).
0.0004508952953870.000423517514093
Это немного искажено (из-за того, что печать плохо работает с многопоточностью), так что здесь немного понятнее:
>>> Online: dest: 192.168.1.1, recv addr: ('192.168.1.1', 0).
Offline:dest: 1.2.3.4, recv addr: ('192.168.1.1', 0). # this is the issue - I assume dest should be the same as recv address?
0.000450895295387
0.000423517514093
Мои вопросы:
Может кто-нибудь воссоздать это?
Должен ли пинг вести себя так? Я предполагаю, что нет.
Существует ли существующий ICMP-пинг для python, который не будет иметь такого поведения?
В качестве альтернативы, можете ли вы подумать о простом исправлении - например, опрос receive_one_ping
, пока наш пункт назначения не совпадет с нашим адресом получения?
Редактировать: Я создал проблему на странице python-ping github