在原始套接字上接收UDP数据报?

在原始套接字上接收UDP数据报?

问题描述:

我想使用原始套接字为教育目的在ruby中编写我自己的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协议(解码数据报&做校验和)我自己!

原生套接字在IP级别工作。您不能将原始套接字绑定到端口。你可以通过设置合适的套接字选项来绑定到本地地址(我不知道如何在Ruby中做到这一点,在C中调用setsockopt。而不是IPPROTO_RAW,你应该在协议中使用IPPROTO_UDP。接收在该IP地址或该接口上接收到的所有UDP数据报(如果套接字绑定在该接口上)