Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python构建UDP数据包_Python_Sockets_Python 2.7_Raw Sockets - Fatal编程技术网

用Python构建UDP数据包

用Python构建UDP数据包,python,sockets,python-2.7,raw-sockets,Python,Sockets,Python 2.7,Raw Sockets,互联网上已经有一段代码显示了如何使用原始套接字在Python中构建和发送TCP数据包,但我迫切需要一个如何构建UDP数据包的示例 我阅读了这个链接,了解到udp报头只包含src ip、src port、length和checksum,还了解到如果我创建一个IPPROTO_udp套接字而不是IPPROTO_原始套接字,那么内核应该自动填充ip报头 然而,我没有成功地做到这一点 下面是使用原始套接字构建tcp数据包的代码: import socket import struct def make_

互联网上已经有一段代码显示了如何使用原始套接字在Python中构建和发送TCP数据包,但我迫切需要一个如何构建UDP数据包的示例

我阅读了这个链接,了解到udp报头只包含src ip、src port、length和checksum,还了解到如果我创建一个IPPROTO_udp套接字而不是IPPROTO_原始套接字,那么内核应该自动填充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显示缓冲区大小。就套接字部分而言,没有其他必要的更改

我希望使用原始套接字从数据包中读取IP_ID。谢谢,这个答案有助于制作DNS缓存解析程序!这不能回答他的问题。他明确询问了原始UDP数据包。不幸的是,这对他的问题来说太高了。你找到解决办法了吗?