我正在尝试使用原始套接字在ruby中编写我自己的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协议(解码数据报并做一个校验和)!
答案 0 :(得分:1)
原始套接字在IP级别工作。您无法将原始套接字绑定到端口。您可以通过设置正确的套接字选项来绑定到带有bind或接口的本地地址(我不知道如何在Ruby中执行它,在C中调用setsockopt。而不是IPPROTO_RAW,您应该在协议中使用IPPROTO_UDP。您将接收在该IP地址或该接口上接收的所有UDP数据报(如果套接字绑定到该接口)。