【问题标题】:Receive UDP datagram on raw socket?在原始套接字上接收 UDP 数据报?
【发布时间】:2015-07-21 22:29:11
【问题描述】:

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

【问题讨论】:

    标签: ruby sockets udp network-protocols


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      相关资源
      最近更新 更多