簡體   English   中英

用 Python 構建 UDP 數據包

[英]Building UDP packet in Python

互聯網上已經有一段代碼展示了如何使用原始套接字在 Python 中構建和發送 TCP 數據包,但我非常需要一個如何構建 UDP 數據包的示例。

我閱讀了此鏈接http://www.ietf.org/rfc/rfc768.txt並了解 udp 標頭僅包含 src ip、src 端口、長度和校驗和,並且如果我創建 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做同樣的事情?

對我來說最好的解決方案就是編輯現有的代碼,因為閱讀抽象信息對我沒有多大幫助。

我在 Windows XP 上使用 Python 2.7。

只是這個:

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 顯示緩沖區大小。 就插座部分而言,沒有其他必要的變化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM