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

时间:2015-07-21 22:29:12

标签: ruby sockets udp network-protocols

我正在尝试使用原始套接字在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协议(解码数据报并做一个校验和)!

1 个答案:

答案 0 :(得分:1)

原始套接字在IP级别工作。您无法将原始套接字绑定到端口。您可以通过设置正确的套接字选项来绑定到带有bind或接口的本地地址(我不知道如何在Ruby中执行它,在C中调用setsockopt。而不是IPPROTO_RAW,您应该在协议中使用IPPROTO_UDP。您将接收在该IP地址或该接口上接收的所有UDP数据报(如果套接字绑定到该接口)。