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
User contributions licensed under CC BY-SA 3.0