2013-11-30 4 views
0

В Интернете уже есть код, который показывает, как создавать и отправлять TCP-пакет в Python с использованием сырых сокетов, но мне отчаянно нужен пример построения UDP-кода.Создание UDP-пакета в Python

Я прочитал эту ссылку http://www.ietf.org/rfc/rfc768.txt и понимает, что УДП заголовок состоит только из Src IP, ЦСИ порта, длины и контрольной суммы, а также читал, что если я создаю IPPROTO_UDP гнездо вместо розетки IPPROTO_RAW, заголовок IP должен быть заполнен автоматически ядро.

Тем не менее, я не имел никакого успеха в этом.

Вот код здания TCP-пакеты с сырой розеткой:

import socket 
import struct 

def make_ip(proto, srcip, dstip, ident=54321): 
    saddr = socket.inet_aton(srcip) 
    daddr = socket.inet_aton(dstip) 
    ihl_ver = (4 << 4) | 5 
    return struct.pack('!BBHHHBBH4s4s' , 
         ihl_ver, 0, 0, ident, 0, 255, proto, 0, saddr, daddr) 

def make_tcp(srcport, dstport, payload, seq=123, ackseq=0, 
      fin=False, syn=True, rst=False, psh=False, ack=False, urg=False, 
      window=5840): 
    offset_res = (5 << 4) | 0 
    flags = (fin | (syn << 1) | (rst << 2) | 
      (psh <<3) | (ack << 4) | (urg << 5)) 
    return struct.pack('!HHLLBBHHH', 
         srcport, dstport, seq, ackseq, offset_res, 
         flags, window, 0, 0) 

srcip = dstip = '127.0.0.1' 
srcport, dstport = 11001, 11000 
payload = '[TESTING]\n' 

ip = make_ip(socket.IPPROTO_TCP, srcip, dstip) 
tcp = make_tcp(srcport, dstport, payload) 
packet = ip + tcp + payload 

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) 
s.sendto(packet, (dstip, 0)) 
response, addr = s.recvfrom(65535) 
response_id = struct.unpack('!H', response[4:6]) 
print response_id 

Как сделать то же самое с UDP вместо этого?

Лучшее решение для меня просто редактирования существующего кода, так как чтение абстрактной информации не помогло мне много ...

Благодаря вперед

PS, если она имеет отношение к любому, я использую python 2.7 на windows xp.

ответ

0

Просто это:

import socket 
sock = socket.socket(socket.AF_INET, # Internet 
       socket.SOCK_DGRAM) # UDP 
sock.bind((IP,PORT)) 

Для отправки:

sock.sendto(message,(IP,PORT)) 

Чтобы получить:

sock.recvfrom(1024) 

1024 отображает размер буфера. Нет никаких других изменений, необходимых для части сокета

+0

Я хочу использовать сырое гнездо для чтения IP_ID из пакета. – Jjang

+0

Спасибо, этот ответ был полезен при создании DNS-кэширующего преобразователя! –

+0

Это не отвечает на его вопрос. Он явно спросил о необработанных UDP-пакетах. Это, к сожалению, слишком высокий уровень подхода к его вопросу. –