только что играл, и следующее работает как самостоятельный / минимальный рабочий пример для меня с Python 3.7.1 под OSX и Linux
создание правильного набора параметров IP:
from scapy.all import IPOption, raw
ipopts = raw(IPOption(
copy_flag=1, optclass='control', option=31,
value='\x00\x01\x00\x00RTGAME'))
(если у вас нет Scapy, выше должно сгенерироваться: b'\x9f\x0c\x00\x01\x00\x00RTGAME'
)
код клиента:
import socket
from time import sleep
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.connect(('127.0.0.1', 3478))
s.setsockopt(socket.IPPROTO_IP, socket.IP_OPTIONS, ipopts)
while True:
s.send(b'message from a game')
sleep(1)
код сервера:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind(('', 3478))
s.setsockopt(socket.IPPROTO_IP, socket.IP_RECVOPTS, 1)
while True:
print(*s.recvmsg(4096, 1024))
это должно привести к тому, что "сервер" отобразит такие строки, как:
b'message from a game\n' [(0, 6, b'\x9f\x0c\x00\x01\x00\x00RTGAME')] 0 ('127.0.0.1', 46047)
Более того, я могу наблюдать за перемещением пакетов по сети, выполнив:
sudo tcpdump -i lo0 -vvv -n 'udp and port 3478'
в командной строке или это в Scapy:
sniff(iface='lo0', filter='udp and port 3478', prn=lambda x: x.show())
по какой-то причине я фактически не получаю вспомогательные данные, содержащие параметры IP в OSX, но эти данные отображаются в анализаторах пакетов.