在原始套接字上接收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数据报(如果套接字绑定在该接口上)