python socket.sendto
Je suis nouveau sur python(3.3) la mise en réseau de la programmation, donc pour commencer, j'ai essayé d'écrire une base traceroute programme. L'une des lignes de code est:
send_socket.sendto(512, '', (dest_name, port))
J'obtiens une erreur à cette ligne dans la console indiquant "TypeError: 'int' ne prend pas en charge la mémoire tampon d'interface". J'ai essayé avec une piqûre et j'ai eu la même erreur avec 'str' au lieu de 'int'. J'ai également regardé la documentation, et essayé quelques autres formulations en vain.
Quelqu'un a une expérience avec cela?
import socket
def main(dest_name):
dest_addr = socket.gethostbyname(dest_name)
port = 33434
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('www.google.com')
Vous devez vous connecter pour publier un commentaire.
Convertir le message à la chaîne:
Encoder la chaîne d'octets car
sendto
n'accepte passtring
objetsÉgalement intéressant de noter que vous pouvez envoyer des données arbitraires avec ces fonctions de réseau et il n'a pas besoin d'être du texte codé. par exemple,
soc.sendto(b'\xff', (host, port))
est parfaitement valide pour envoyer un seulFF
octet dans un paquet UDP et ne pas décoder comme de l'utf-8 à l'aide du code ci-dessus.