首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCPServer总是延迟对dns反向查找?-如何禁用?

TCPServer总是延迟对dns反向查找?-如何禁用?
EN

Stack Overflow用户
提问于 2014-06-29 19:26:52
回答 1查看 444关注 0票数 1

我用ruby创建了一个TCPServer。

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

只有当我从远程机器连接时才会发生这种情况。

从同一台机器连接已运行的服务将发送immidiate响应。

对于同一台机器上的连接,如果通过本地主机或机器ip进行连接,则没有区别。

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

在gserver.rb中,它是第263行

代码语言:javascript
复制
client = @tcpServer.accept

这里的延迟发生了,我不知道这种方法是什么。

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

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

代码语言:javascript
复制
BasicSocket.do_not_reverse_lookup = true

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

代码语言:javascript
复制
Socket.do_not_reverse_lookup = true

以及客户端连接套接字

代码语言:javascript
复制
client.do_not_reverse_lookup = true

但这也没有改变任何拖延。

只要建立了连接,就会解析remote_host和remote_ip的值,并将其定义在主机文件中。

我尝试了在ubuntu14.04上运行ruby2.2.1,以及运行debian喘息的ruby1.9.3。

同样的行为-(长)延迟连接服务。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-03 23:26:54

这个问题取决于我在MAC OSX Mav上运行的客户端机器。

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

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

代码语言:javascript
复制
telnet -4 my-server 3333

我已经构建了一个小型的连接回显服务,您可以在这里检查解析和时间。

如果您更改NO_REVERSE_LOOKUP,您将得到If或ADDRESSes,如果无法解决,则会得到不同的响应时间。

代码语言:javascript
复制
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问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24479464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档