#!/usr/bin/python
import time
import random
import struct
import select
import socket
def chk(data):
x = sum(x << 8 if i % 2 else x for i, x in enumerate(data)) & 0xFFFFFFFF
x = (x >> 16) + (x & 0xFFFF)
x = (x >> 16) + (x & 0xFFFF)
return struct.pack('<H', ~x & 0xFFFF)
def ping(addr, timeout=1, number=1, data=b''):
conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
payload = struct.pack('!HH', random.randrange(0, 65536), number) + data
conn.connect((addr, 80))
conn.sendall(b'\x08\0' + chk(b'\x08\0\0\0' + payload) + payload)
start = time.time()
while select.select([conn], [], [], max(0, start + timeout - time.time()))[0]:
data = conn.recv(65536)
if len(data) < 20 or len(data) < struct.unpack_from('!xxH', data)[0]:
continue
if data[20:] == b'\0\0' + chk(b'\0\0\0\0' + payload) + payload:
return time.time() - start
if __name__ == '__main__':
target = raw_input("Please enter a IP Adress: ")
print(ping(target))
. 오류가 발생했습니다. 스크립트의 결과는 아래와 같습니다.역 추적 (가장 최근의 마지막 호출) 형식 오류 : 지원되지 않는 피연산자 유형 (들) +에 대한 'INT'와 'STR'
# python Pinger.py
Please enter a IP Adress: 89.1.3.2
Traceback (most recent call last):
File "Pinger.py", line 35, in <module>
print(ping(target))
File "Pinger.py", line 22, in ping
conn.sendall(b'\x08\0' + chk(b'\x08\0\0\0' + payload) + payload)
File "Pinger.py", line 11, in chk
x = sum(x << 8 if i % 2 else x for i, x in enumerate(data)) & 0xFFFFFFFF
TypeError: unsupported operand type(s) for +: 'int' and 'str'
TypeError 및 Traceback을 해결하는 데 도움이 될 수 있습니까?
'payload'의 내용은 문자열이고,'chk'에 보낸 내용의 나머지 부분은 정수로 평가되는 요소가 있고 문자열로 비트 시프트 된 정수를 추가하려고합니다. 'sum'은 무엇을하는지). 또는'sum'에 보낸 첫 번째 요소는 문자열이 될 수 있습니다.이 값을 기본 시작 값인 0에 추가하려고합니다. 아마 그럴 가능성이 큽니다. – TigerhawkT3
실패 할 경우'data'의 값은 무엇입니까? –
파이썬 2.7 ['struct.pack'] (https://docs.python.org/2/library/struct.html#struct.pack)은'str'을 반환합니다. 3.6에서 it [returns'bytes'] (https://docs.python.org/3/library/struct.html#struct.pack) –