How can I add custom fields like IP and UDP headers in python in the SOCK_RAW format?I want to have a custom field in the packet and use that field in computation.
解决方案
You didn't specify where you want that custom field. This example lets you build the UDP header at will (at least on Linux - there might be OS-dependent behaviour):
from socket import *
import struct
s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
data = 'string'
sport = 4711 # arbitrary source port
dport = 45134 # arbitrary destination port
length = 8+len(data);
checksum = 0
udp_header = struct.pack('!HHHH', sport, dport, length, checksum)
s.sendto(udp_header+data, ('', 0));
Tested with:
# socat -u UDP:localhost:4711 - &
# netstat -up
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 localhost:45134 localhost:4711 ESTABLISHED 2663/socat
# tcpdump -ilo -vv -x
11:32:07.409163 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 34)
localhost.4711 > localhost.45134: [no cksum] UDP, length 6
0x0000: 4500 0022 0000 4000 4011 3cc9 7f00 0001
0x0010: 7f00 0001 1267 b04e 000e 0000 7374 7269
0x0020: 6e67