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

标签 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 协议(protocol)(​​解码数据报并进行校验和)!

最佳答案

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

关于ruby - 在原始套接字上接收 UDP 数据报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31550745/

相关文章:

ruby - 没有从 to_s 获得正确的输出

Linux 套接字 : Zero-copy local, TCP/IP 远程

parsing - 高效灵活的二进制数据解析

c - 在socket中,如果我们在socket()中将SOCK_STREAM作为第二个参数,将UDP作为第三个参数,会发生什么?

ruby-on-rails - 使用 rspec 测试具有 yield 的方法

javascript - 是否有具有完整开发周期的基于原型(prototype)的语言?

Rubywarrior Level 4(清理我的代码帮助)

c++ - Boost::asio::write上的互斥不起作用

php - 如何为 set socks 5 或 php stream_socket_client 的 http 代理制作上下文数组

c++ - 即使没有传入消息,Boost ASIO UDP 客户端 async_receive_from 也会调用处理程序