1

我用 ruby​​ gserver 创建了一个 TCPServer。

每次我远程连接到服务器时,需要 2-4 秒才能建立连接。

仅当我从远程计算机连接时才会发生这种情况。

来自运行该服务的同一台机器的连接将发送即时响应。

对于同一台机器上的连接,如果我通过 localhost 或通过机器 ip 连接没有区别。


我认为延迟取决于反向查找,但无法定位原因。

在 gserver.rb 中是第 263 行

client = @tcpServer.accept

这里出现延迟,我不知道这个方法是什么。


我将测试期间使用的所有机器添加到本地主机文件中。但这并没有改变。

使用 Webrick 时也会发生同样的情况,我也尝试设置

BasicSocket.do_not_reverse_lookup = true

以及直接在生成的服务器套接字上

Socket.do_not_reverse_lookup = true

以及在客户端连接套接字上

client.do_not_reverse_lookup = true

但这也没有改变延迟。


每当建立连接时,remote_host 和 remote_ip 的值都会被解析并在 hosts 文件中定义。


我尝试在 ubuntu 14.04 上运行 ruby​​ 2.2.1 以及运行 debian wheezy 的 ruby​​ 1.9.3。

相同的行为 - 连接服务的(长时间)延迟。

问:如何修复/禁用 TCPServer 上的查找?

4

1 回答 1

0

问题取决于我在 MAC OSX Mav 上运行的客户端计算机。

使用的 telnet 客户端尝试打开 IPv6 连接,然后尝试打开 IPv4。

要解决延迟,只需打开连接

telnet -4 my-server 3333

我已经建立了一个小型连接回声服务,您可以在其中检查解决方案和时间安排。

如果您更改 NO_REVERSE_LOOKUP,您将获得 IP 或 ADDRESS,如果无法解析,则会获得不同的响应时间。

require 'socket'

NO_REVERSE_LOOKUP = true
CONNECT_PORT = 3333

puts "#{Time.now} Starting service on port: #{CONNECT_PORT}"

# the full hell - just to test if anything meets what we want
TCPServer.do_not_reverse_lookup = NO_REVERSE_LOOKUP
BasicSocket.do_not_reverse_lookup = NO_REVERSE_LOOKUP
Socket.do_not_reverse_lookup = NO_REVERSE_LOOKUP

srv = TCPServer.open(CONNECT_PORT)

puts "#{Time.now} Waiting for client"

client = srv.accept

puts "#{Time.now} Client connected"

client.do_not_reverse_lookup = NO_REVERSE_LOOKUP

client.print "Hello connected\n"

# in case that we disabled reverse lookup, we should only receive IP Adresses

puts "#{Time.now} Getting server address infos" 

puts "SERVER INFO:"
puts NO_REVERSE_LOOKUP ? client.addr(:numeric) : client.addr(:hostname)

puts ""

puts "#{Time.now} Getting remote client infos"

puts "REMOTE INFO:"
puts NO_REVERSE_LOOKUP ? client.peeraddr(:numeric) : client.peeraddr(:hostname)

###

puts "#{Time.now} Closing connection"

client.close

puts "#{Time.now} End"

感谢#ruby-lang irc 的 drbrain 指出 IPv6 问题。

于 2014-07-03T23:26:54.157 回答