我用ruby创建了一个TCPServer。
每次我远程连接到服务器时,都需要2-4秒才能建立连接。
只有当我从远程机器连接时才会发生这种情况。
从同一台机器连接已运行的服务将发送immidiate响应。
对于同一台机器上的连接,如果通过本地主机或机器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的值,并将其定义在主机文件中。
我尝试了在ubuntu14.04上运行ruby2.2.1,以及运行debian喘息的ruby1.9.3。
同样的行为-(长)延迟连接服务。
问:如何在TCPServer上修复/禁用查找?
发布于 2014-07-03 23:26:54
这个问题取决于我在MAC OSX Mav上运行的客户端机器。
使用的telnet客户端尝试打开IPv6连接,然后打开IPv4。
要解决延迟,只需打开连接
telnet -4 my-server 3333我已经构建了一个小型的连接回显服务,您可以在这里检查解析和时间。
如果您更改NO_REVERSE_LOOKUP,您将得到If或ADDRESSes,如果无法解决,则会得到不同的响应时间。
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公司的drbrain为我指出了IPv6问题。
https://stackoverflow.com/questions/24479464
复制相似问题