我正在尝试使用原始套接字在 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/