raise socket.error(msg) python ICMP Pinger Operation not permitted

0

I am working on a ICMP Pinger class for python but whenever I run this code I keep getting the same error message. I looked it up and I know that it can be caused by not having SUDO access but tried running it in the terminal as sudo python ICMPPinger.py and still came up with the same error. Any help is appreciated.

ICMPPing.py:

ICMP_ECHO_REQUEST = 8  # ICMP type code for echo request messages
ICMP_ECHO_REPLY = 0  # ICMP type code for echo reply messages
timeRTT = []
packageSent = 0
packageRev = 0


def checksum(string):
    csum = 0
    countTo = (len(string) // 2) * 2
    count = 0

    while count < countTo:
        thisVal = ord(string[count + 1]) * 256 + ord(string[count])
        csum = csum + thisVal
        csum = csum & 0xffffffff
        count = count + 2

    if countTo < len(string):
        csum = csum + ord(string[len(string) - 1])
        csum = csum & 0xffffffff

    csum = (csum >> 16) + (csum & 0xffff)
    csum = csum + (csum >> 16)
    answer = ~csum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)

    if sys.platform == 'darwin':
        answer = socket.htons(answer) & 0xffff
    else:
        answer = socket.htons(answer)

    return answer


def receiveOnePing(icmpSocket, destinationAddress, ID, timeout):
    global packageRev, timeRTT
    timeLeft = timeout
    while 1:
        startedSelect = time.time()
        whatReady = select.select([icmpSocket], [], [], timeLeft)
        howLongInSelect = (time.time() - startedSelect)
        if whatReady[0] == []:  # Timeout
            return "0: Destination Network Unreachable,"
        timeReceived = time.time()
        recPacket, addr = icmpSocket.recvfrom(1024)

        icmpHeader = recPacket[20:28]
        requestType, code, revChecksum, revId, revSequence = struct.unpack('bbHHh', icmpHeader)
        if ID == revId:
            bytesInDouble = struct.calcsize('d')
            timeData = struct.unpack('d', recPacket[28:28 + bytesInDouble])[0]
            timeRTT.append(timeReceived - timeData)
            packageRev += 1
            return timeReceived - timeData
        else:
            return "ID is not the same!"
        timeLeft = timeLeft - howLongInSelect
        # Fill in end
        if timeLeft <= 0:
            return "1: Destination Host Unreachable."


def sendOnePing(icmpSocket, destinationAddress, ID):
    global packageSent
    # Header is type (8), code (8), checksum (16), id (16), sequence (16)
    myChecksum = 0
    # Make a dummy header with a 0 checksum.
    # struct -- Interpret strings as packed binary data
    header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, myChecksum, ID, 1)
    data = struct.pack("d", time.time())
    # Calculate the checksum on the data and the dummy header.
    myChecksum = checksum(header + data)
    # Get the right checksum, and put in the header
    if sys.platform == 'darwin':
        myChecksum = socket.htons(myChecksum) & 0xffff
        # Convert 16-bit integers from host to network byte order.
    else:
        myChecksum = socket.htons(myChecksum)
    header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, myChecksum, ID, 1)
    packet = header + data
    icmpSocket.sendto(packet, (destinationAddress, 1))
    packageSent += 1

    # pass  # Remove/replace when function is complete


def doOnePing(destinationAddress, timeout):
    icmp = socket.getprotobyname("icmp")
    try:
        mySocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
    except socket.error, (errno, msg):
        if errno == 1:
            raise socket.error(msg)
    # Fill in end
    myID = os.getpid() & 0xFFFF  # Return the current process i
    sendOnePing(mySocket, destinationAddress, myID)
    delay = receiveOnePing(mySocket, myID, timeout, destinationAddress)
    mySocket.close()
    return delay


def ping(host, timeout=1):

    # timeout=1 means: If one second goes by without a reply from the server,
    dest = socket.gethostbyname(host)
    print "Pinging " + dest + " using Python:"
    print ""
    # Send ping requests to a server separated by approximately one second
    while 1:
        delay = doOnePing(dest, timeout)
        print "RTT:", delay
        print "maxRTT:", (max(timeRTT) if len(timeRTT) > 0 else 0), "\tminRTT:", (
            min(timeRTT) if len(timeRTT) > 0 else 0), "\naverageRTT:", float(
            sum(timeRTT) / len(timeRTT) if len(timeRTT) > 0 else float("nan"))
        print "Package Lose Rate:", ((packageSent - packageRev) / packageSent if packageRev > 0 else 0)
        time.sleep(1)  # one second
        return delay


ping("google.com")

Error Message:

Traceback (most recent call last): File "/Users/jonathanthomann/PycharmProjects/ICMPPing/ICMPPing.py", line 133, in ping("google.com") File "/Users/jonathanthomann/PycharmProjects/ICMPPing/ICMPPing.py", line 123, in ping delay = doOnePing(dest, timeout) File "/Users/jonathanthomann/PycharmProjects/ICMPPing/ICMPPing.py", line 106, in doOnePing raise socket.error(msg) socket.error: Operation not permitted

python
ping
checksum
icmp
asked on Stack Overflow Feb 21, 2019 by jt1423 • edited Mar 10, 2019 by shaochuancs

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0