【问题标题】:How to bind sockets in Ruby?如何在 Ruby 中绑定套接字?
【发布时间】:2015-11-20 02:57:04
【问题描述】:

我想直接使用 ruby​​ Socket 类,TCPSocket 不是一个选项。 代码:

require 'socket'
include Socket::Constants

socket = Socket.new :INET, :STREAM, 0
socket.bind (Socket.pack_sockaddr_in 2200, 'localhost')

错误:

`bind':使用了与请求的协议不兼容的地址。 (Errno::EAFNOSUPPORT)

我在 Windows 机器上使用 ruby​​ 1.9.3。

额外信息:

Socket.pack_sockaddr_in(2200, 'localhost')

=> "\x17\x00\b\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x01\x00\x00\x00\x00"

主机文件:

# localhost 名称解析在 DNS 本身内处理。
# 127.0.0.1 本地主机
# ::1 本地主机

【问题讨论】:

  • 我认为在 Windows 中使用 Socket.pack_sockaddr_in 2200, 'localhost' 返回的地址有些奇怪。这就是我在 linux 上返回的内容=> "\x02\x00\b\x98\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
  • @Rico 我将 sockaddr_in 的输出添加到我的问题中。与您的相比,它的字节数更少。会不会是 IPV4、IPV6 不匹配?
  • 是的,试试我在回答中的内容。
  • @texasbruce 将我的主机文件中的内容添加到问题中。有 2 个条目,但被注释掉了。

标签: ruby sockets


【解决方案1】:

你可以试试:

require 'socket'
include Socket::Constants

socket = Socket.new :INET, :STREAM, 0
socket.bind (Socket.pack_sockaddr_in 2200, '127.0.0.1')

可能是localhost 正在返回您的 IPv6 地址而不是接收它。

【讨论】:

  • @SlySherZ 如果这对您有用,您需要检查您的主机文件。它可能会错过 localhost 条目或指向其他地址(例如 IP6 地址)
  • 是的,还要检查dig localhost 返回的内容。不确定dig 是否适用于 Windows(相当于 nslookup)
  • 我从那个查询中得到了一个 IPV6。
  • 在这种情况下,socket = Socket.new(:INET6, :STREAM, 0) 也可以与 localhost 一起使用
猜你喜欢
  • 1970-01-01
  • 2011-02-18
  • 2017-11-29
  • 2015-03-18
  • 2012-09-24
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多