Я пытаюсь написать свою собственную реализацию UDP в рубине для образовательных целей с использованием сырых сокетов.Получать UDP-дейтаграмму на сырой сокет?
Вот что я до сих пор:
require 'socket'
addr = Socket.pack_sockaddr_in(4567, '127.0.0.1')
socket = Socket.new(
Socket::PF_INET,
Socket::SOCK_RAW,
Socket::IPPROTO_RAW
)
socket.bind(addr)
socket.recvfrom(1024)
Я проверяю это так:
require 'socket'
udp = UDPSocket.new
udp.send "Hello World", 0, "127.0.0.1", 4567
Но вызов recvfrom
блокирует бесконечно.
Если изменить его к этому:
socket = Socket.new(
Socket::PF_INET,
Socket::SOCK_DGRAM,
Socket::IPPROTO_UDP
)
Это, конечно, работает, потому что это путь на системном уровне, чтобы принимать пакеты UDP.
Как я могу получить UDP-пакеты в сыром сокете?
Чтобы быть ясным: я хочу обрабатывать фактический протокол UDP (декодирование дейтаграммы &, выполняющей контрольную сумму) сам!