2015-07-21 2 views
1

Я пытаюсь написать свою собственную реализацию 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 (декодирование дейтаграммы &, выполняющей контрольную сумму) сам!

ответ

1

Сырые сокеты работают на уровне IP. Вы не можете привязать сырой сокет к порту. Вы можете привязываться к локальному адресу со связыванием или к интерфейсу, задав правильные параметры сокета (я не знаю, как это сделать в Ruby, в C вы вызываете setsockopt. Вместо IPPROTO_RAW вы должны использовать протокол IPPROTO_UDP в протоколе. получать все датаграммы UDP, полученные на этом IP-адресе, или этот интерфейс, если сокет привязан к нему.

Смежные вопросы