Ping a site in Python?

前端 未结 15 2246
我寻月下人不归
我寻月下人不归 2020-11-22 09:22

How do I ping a website or IP address with Python?

相关标签:
15条回答
  • 2020-11-22 09:35
    import subprocess as s
    ip=raw_input("Enter the IP/Domain name:")
    if(s.call(["ping",ip])==0):
        print "your IP is alive"
    else:
        print "Check ur IP"
    
    0 讨论(0)
  • 2020-11-22 09:40

    If you want something actually in Python, that you can play with, have a look at Scapy:

    from scapy.all import *
    request = IP(dst="www.google.com")/ICMP()
    answer = sr1(request)
    

    That's in my opinion much better (and fully cross-platform), than some funky subprocess calls. Also you can have as much information about the answer (sequence ID.....) as you want, as you have the packet itself.

    0 讨论(0)
  • 2020-11-22 09:40

    Most simple answer is:

    import os
    os.system("ping google.com") 
    
    0 讨论(0)
  • 2020-11-22 09:41

    See this pure Python ping by Matthew Dixon Cowles and Jens Diemer. Also, remember that Python requires root to spawn ICMP (i.e. ping) sockets in linux.

    import ping, socket
    try:
        ping.verbose_ping('www.google.com', count=3)
        delay = ping.Ping('www.wikipedia.org', timeout=2000).do()
    except socket.error, e:
        print "Ping Error:", e
    

    The source code itself is easy to read, see the implementations of verbose_ping and of Ping.do for inspiration.

    0 讨论(0)
  • 2020-11-22 09:43

    It's hard to say what your question is, but there are some alternatives.

    If you mean to literally execute a request using the ICMP ping protocol, you can get an ICMP library and execute the ping request directly. Google "Python ICMP" to find things like this icmplib. You might want to look at scapy, also.

    This will be much faster than using os.system("ping " + ip ).

    If you mean to generically "ping" a box to see if it's up, you can use the echo protocol on port 7.

    For echo, you use the socket library to open the IP address and port 7. You write something on that port, send a carriage return ("\r\n") and then read the reply.

    If you mean to "ping" a web site to see if the site is running, you have to use the http protocol on port 80.

    For or properly checking a web server, you use urllib2 to open a specific URL. (/index.html is always popular) and read the response.

    There are still more potential meaning of "ping" including "traceroute" and "finger".

    0 讨论(0)
  • 2020-11-22 09:43

    I did something similar this way, as an inspiration:

    import urllib
    import threading
    import time
    
    def pinger_urllib(host):
      """
      helper function timing the retrival of index.html 
      TODO: should there be a 1MB bogus file?
      """
      t1 = time.time()
      urllib.urlopen(host + '/index.html').read()
      return (time.time() - t1) * 1000.0
    
    
    def task(m):
      """
      the actual task
      """
      delay = float(pinger_urllib(m))
      print '%-30s %5.0f [ms]' % (m, delay)
    
    # parallelization
    tasks = []
    URLs = ['google.com', 'wikipedia.org']
    for m in URLs:
      t = threading.Thread(target=task, args=(m,))
      t.start()
      tasks.append(t)
    
    # synchronization point
    for t in tasks:
      t.join()
    
    0 讨论(0)
提交回复
热议问题