2015-12-03 2 views
1

Я пишу простую программу, чтобы получить число перелетов из моей машины произвольного сайта (в данном случае, www.google.comrecvfrom() не получает каких-либо данных -. Питона

Моя программа кажется . застревать на recvfrom() вызов я установил, что это будет неблокирующей сокет, так что я в состоянии видеть ошибку:

[WinError 10035] A non-blocking socket operation could not be completed immediately 

Когда я запускаю его как гнездо запирающего программа просто запускается вечно.

Ниже мой исходный код. Любая идея, почему я столкнулся с этой проблемой? Спасибо!

import socket 
import select 
import queue 

def main(dest_name): 
    print('launch') 
    dest_addr = socket.gethostbyname(dest_name) 
    # Define UDP and ICMP 
    udp = socket.getprotobyname('udp') 
    icmp = socket.getprotobyname('icmp') 
    timer = 0 
    port = 54321 
    maxHops = 40 
    while True: 
     # Create sender and receiver. Sender uses UDP, receiver uses IDMP 
     sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp) 
     receiver = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) 
     receiver.setblocking(0) 

     print('sockets assigned') 
     # Assign TTL to sender, increment TTL 
     sender.setsockopt(socket.SOL_IP, socket.IP_TTL, timer) 
     print('ttl assigned') 
     # Bind socket and send message from sender to receiver 
     receiver.setblocking(0) 
     receiver.bind(("", port)) 
     print('receiver bound') 
     sender.sendto(bytes("", 'UTF-8'), (dest_name, port)) 
     print('sent') 
     addr = None 
     print('addr assigned') 

     try: 
      # Reads an array of 512-byte sized blocks from sender into addr 
      (_,addr) = receiver.recvfrom(512) 
      addr = addr[0] 
      print("%f\n", addr) 
     # Process socket errors 
     except socket.error as exc: 
      print('Error: please try again.\n') 
      print('%s\n', exc) 
      pass 
     # Close both sockets 
     finally: 
      sender.close() 
      receiver.close() 
      print('closing') 

     timer += 1 

     if dest_addr == addr or timer == maxHops: 
      break 

if __name__ == "__main__": 
    main('www.google.com') 

ответ

0

Как об этом:

#!/usr/bin/python 

import socket 

def main(dest_name): 
    dest_addr = socket.gethostbyname(dest_name) 
    port = 54321 
    max_hops = 40 
    icmp = socket.getprotobyname('icmp') 
    udp = socket.getprotobyname('udp') 
    ttl = 1 
    while True: 
     recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) 
     send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp) 
     send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl) 
     recv_socket.bind(("", port)) 
     send_socket.sendto("", (dest_name, port)) 
     curr_addr = None 
     curr_name = None 
     try: 
      _, curr_addr = recv_socket.recvfrom(512) 
      curr_addr = curr_addr[0] 
      try: 
       curr_name = socket.gethostbyaddr(curr_addr)[0] 
      except socket.error: 
       curr_name = curr_addr 
     except socket.error: 
      pass 
     finally: 
      send_socket.close() 
      recv_socket.close() 

     if curr_addr is not None: 
      curr_host = "%s (%s)" % (curr_name, curr_addr) 
     else: 
      curr_host = "*" 
     print "%d\t%s" % (ttl, curr_host) 

     ttl += 1 
     if curr_addr == dest_addr or ttl > max_hops: 
      break 

if __name__ == "__main__": 
    main('google.com') 
+0

> не распознается системой по некоторым причинам. Я изменил его на ==, и он все еще ничего не возвращал; он просто бежал вечно. – Haley

+0

woops, это не > это «>» «Больше, чем» закодировано, извините (отредактированный ответ) –

+1

Ничего. Я запускал это на виртуальной машине Linux, и это сработало! Кажется, что-то связано с запуском на машине Windows. Спасибо за вашу помощь. – Haley

Смежные вопросы