gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:04:45 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com