How to set the socket type and the protocol of a socket using create_connection?
Guillaume Comte
guillaume.comte10 at gmail.com
Tue Aug 21 13:00:28 EDT 2012
Unfortunatly, my_socket.bind((src_addr, 1)) doesn't work. I get the error message: "socket.error: [Errno 49] Can't assign requested address"...
I've tried to change the protocol to IPPROTO_RAW. Here is a simple example of the code:
import socket
import os
import struct
import time
import select
ICMP_ECHO_REQUEST = 8
PACKET_SIZE = 64 # Bytes
TIMEOUT = 0.5 # Seconds
def do_one(src_addr, dest_addr):
my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
if src_addr != None:
src_addr = socket.gethostbyname(src_addr)
my_socket.bind((src_addr, 1))
my_id = os.getpid() & 0xFFFF
print "id: " + str(my_id)
print "sending..."
send_one(dest_addr, my_socket, my_id)
print "receiving..."
id = receive_one(my_socket)
if id == None:
print "nothing received !"
else:
print "received id: " + str(id)
my_socket.close()
def checksum(source_string):
...
def send_one(addr, my_socket, id):
# Header: type (8), code (8), checksum (16), id (16), sequence number (16)
cs = 0
header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, cs, socket.htons(id), 0)
data = PACKET_SIZE * "G"
cs = checksum(header + data)
header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, socket.htons(cs), socket.htons(id), 0)
packet = header + data
my_socket.sendto(packet, (socket.gethostbyname(addr), 1))
def receive_one(my_socket):
while True:
what_ready = select.select([my_socket], [], [], TIMEOUT)
if what_ready[0] == []:
return None
received_packet = my_socket.recvfrom(1024)[0]
header = received_packet[20:28]
id = struct.unpack("bbHHh", header)[3]
return socket.ntohs(id)
if __name__ == "__main__":
import sys
dst = sys.argv[1]
print "dst: " + dst
try:
src = sys.argv[2]
print "src: " + src
except IndexError:
src = None
do_one(src, dst)
But when I try to set a source address, I still get the same error message...
Does anyone know how I could build the IP header (I don't even know if it can be the solution but it's worth a try...)?
More information about the Python-list
mailing list