【发布时间】:2020-02-15 23:27:37
【问题描述】:
互联网上已经有一段代码展示了如何使用原始套接字在 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。
【问题讨论】:
-
您找到解决方案了吗?
标签: python sockets python-2.7 raw-sockets