lua dnshttp 不走dns解析吗

博客访问: 167681
博文数量: 31
博客积分: 1415
博客等级: 上尉
技术积分: 320
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
问题描述:最近系统上线,在测试mail发送功能的时候,发现大部分mail都可以正常收到,不过有个同事的mail却始终无法收到。据了解,这个同事使用的是在英国某个大学的mail。另外,公司邮箱托管在一个mail提供商的服务器上,不过系统发信是使用得本机配置的smtp server;也就表示系统发信使用的smtp server是没有合法域名的。
解决过程:1.发现问题,首先第一步查看系统maillog,找到如下内容。Apr 19 10:19:09 report qmail: .690610 delivery 150: failure: 131.111.8.147_does_not_like_recipient./Remote_host_said:_550-Verification_failed_for_/550-It_appears_that_the_DNS_operator_/550-has_installed_an_invalid_MX_record_with_an_IP_address/550-instead_of_a_domain_name_on_the_right_hand_side./550_Sender_verify_failed/Giving_up_on_131.111.8.147.判断可能是由于没有配置DNS反向解析导致的问题,另外找了一个mail系统进行测试(该系统拥有合法DNS PTR记录),测试可以正常接收邮件;在此,初步判断是缺少DNS反向解析的原因。
2.开始着手解决DNS反向解析,由于以前没有设计过此类问题,根据原理,应该是由IP地址管理单位来做反向解析的;电话询问托管机房,居然说是域名提供商做;又电话询问域名提供商,居然说是托管机房做。唉。。。从原理来说,应该是IP地址管理单位来做DNS反向解析;为了确认推断,登录,发现果然如此;通过cnnic找到ip地址管理单位,到了这一步,只要提交个申请应该就问题解决了。
3.恰恰在此时,我又使用一个朋友的系统发送邮件做个测试,同时该smtp server也没有合法PTR记录,居然成功了。这下我比较纳闷了,怎么会出现这么怪的问题呢???
4.后来在无意中发现,执行host -t 查询该域名的MX记录的时候,查询结果和我这个朋友的不同。此时,突然记起在配置DNS的时候,MX记录一定要指向一个域名,而不能是IP地址;为了验证这个推断,分别执行host -t 和host -t ,结果显示我的MX记录指向IP地址,朋友的MX记录指向域名。
5.登录,进入万网的DNS维护界面,发现MX记录果然指向了一个IP地址,改为指向域名。
6.大约3小时候,DNS同步完成,重新测试,成功。
结论:1.在一些mail系统中,反向解析的确存在,不过不是解析IP地址到域名,而是查看邮件发送者的mail域名是否有合法的DNS记录,这就是为什么MX记录一定要指向一个域名的原因了;由于我们配置成了MX指向一个IP地址,而恰恰这个IP地址没有反向DNS解析,所以导致出错。
阅读(2734) | 评论(4) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
呵呵,我们的邮箱也发现了这样的问题,先是世界反垃圾邮件联盟申诉,但是现在yahOO还是把我们的邮件当做垃圾邮件,ISP要我们交1000块钱没钱/年,才给我们做反向的DNS解析,太黑了,国内的域名提供商又不提供反向SPF解析,看了你的文章还真的有点相似,按照你的方法我也来做下。。。呵呵
我也遇到这个问题了,快帮忙啊,多谢
你可以查看下mail log,具体分析是什么错误,然后有针对性地解决,不一定就是DNS反向解析引起的。
我的万网也做好了设置,可是群发邮件时,却出现大量的退信,不知道是不是由于没有做反向解析,也就是你的结论里的第一条。该怎么解决啊?!
请登录后评论。library for programming Simple Network Management Protocol (SNMP)
client applications based on the
library. It provides access
to MIB definitions and supports all primitives of SNMP version 1, 2c
The project is the continuation of ,
developed by Michele E. Lima and Ana Lucia de Moura, which itself is
based on the CMU library from the Carnegie Mellon University and uses
version 2.5. I decided not to integrate the LuaMan ICMP and
DNS&submodules&into LuaSNMP, because DNS access
is&now availabe through the excellent
library, which is probably also a better home for the ICMP
LuaSNMP is released under the .
LuaSNMP is divided into two major parts:
Access to MIB definition files
Access to the SNMP protocol primitives
Supported Platforms
POSIX systems including Linux and&Windows using Cygwin.&&
LuaSNMP can be loaded dynamically from user Lua scripts.
Addtional standalone application luasnmp with built-in Net-SNMP library and Lua support.
Support of SNMP version 1, 2c and 3
Access and evaluation of Net-SNMP's configuration files
Support of addional configuration tokens
MIB Access Features
Loading of MIBs into a global MIB tree for later usage.
Translation of object names to OIDs and vice versa.
Access to the following SNMP object properties:
name, fullname, OID, description, enums, type, access, parent and
successor objects and default
SNMP Access Features
Support of SNMP version 1, 2c and 3 authentication.
Concurrent session based communication with multiple devices.
Synchronous and asynchronous requests using callback
functions.
Support of PDU encryption
Simple object-oriented access to SNMP objects, tables and
subtrees using&Lua metatables
Arithmetic operations and comparison on variable bindings
using Lua metatables.
can be& downloaded from .
Installation
need the following components to compile and install LuaSNMP:
version 5.0 or 5.1
compatibilty package
release 5 or later (only with Lua 5.0)
library version 5.2.1 recommended: Net-SNMP 5.4.1
version 2.0.2 (only required for trap capturing via the snmptrapd)
version 1.1.4 (only required for the test script and trap capturing via the snmptrapd)
release 8 (only required for the test script)
I recommend to install LuaSocket, LuaLogging and stdlib using .
detailed install instructions see the INSTALL file that comes with the
distribution.
What's New ?
version 1.0-beta has been released.
Initial release.
: LuaSNMP version 1.0.1 released (still beta).
Minor release providing some bug fixes, improved build environment and& deeper testing on Windows/Cygwin platform
: LuaSNMP version 1.0.2 released (still beta)
Various bugfixes.
Better support of ASN.1 special OPAQUE& types (UNSIGNED64, INTEGER64, FLOAT, DOUBLE).
snmp.walk() now returns all&objects that could be retrieved before an error occured.
Support of SNMPv3 user security management (add, clone and delete users, change password on remote machines)
: LuaSNMP version 1.0.3 released (still beta)
Additional MIB informational functions mib.indexes, mib.augments and mib.units.
Support of view based access&VACM (create/delete Sec2Group Mapping, Views and Access).
: LuaSNMP version 1.0.4 released (still beta)
Improved failure handling - Now all functions should return a
non-nil value in case of success or nil plus an error message in case
of failures. No asserts are used anymore within LuaSNMP.
ATTENTION: The function&snmp.close(SESSION) had to be changed. You may have to change your code. Sorry !
Closely related to the above, LuaSNMP now offers
as designed by Diego Nehab for the luasocket library. See
for details.
: LuaSNMP version 1.0.5 released
Adopted to Net-SNMP version 5.4.1
Adopted to Lua 5.1.4
Minor fixes
Thanks to Michele E. Lima and Ana Lucia de Moura
for LuaMan with it's excellent architecture,
from which LuaSNMP and parts of it's documentation have been derived.
It was fun to extend this piece of software with the features of Lua
Thanks to Diego Nehab for his concept of&Finalized Exceptions.
Please refer to file TODO in the top level directory of LuaSNMP.为了您能有最好的浏览体验,我们建议您使用 或者
是 Lua 的网络模块库,它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
它由两部分组成:一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
一、安装LuaSocket
下面介绍两种安装方法
第一种方法:如果你有安装了 Lua 模块的安装和部署工具&,那么一条指令就能安装部署好 LuaSocket:
# luarocks install luasocket
第二种方法:如果没安装有 LuaRocks,也可以源码安装。
先把 LuaRocks 下载下来,当前可用的版本是 luasocket-3.0-rc1(luasocket的源码有托管在):
# git clone /diegonehab/luasocket.git
把源码clone下来之后就可以进行本地源码安装,直接进入到luasocket目录进行编译安装了
# cd luasocket
# make && make install
LuaSocket 使用
接下来是LuaSocket扩展的几种使用方法
1、socket方式请求
-- socket方式请求
local socket = require("socket")
local host = "100.42.237.125"
local file = "/"
local sock = assert(socket.connect(host, 80))
-- 创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
local chunk, status, partial = sock:receive(1024) -- 以 1K 的字节块来接收数据,并把接收到字节块输出来
-- print(chunk or partial)
until status ~= "closed"
sock:close()
-- 关闭 TCP 连接
2、HTTP访问请求
-- http访问请求
http=require("socket.http")
result=http.request("/service/getIpInfo.php?ip=123.189.1.100")
print(result)
3、SMTP方法发送mail
-- smtp方法发送mail
local smtp = require("socket.smtp")
from = "&&" -- 发件人
-- 发送列表
headers = {
to = "", -- 收件人
cc = '&&', -- 抄送
subject = "This is Mail Title"
body = "This is
Mail Content."
r, e = smtp.send{
server="",
password="******",
from = from,
rcpt = rcpt,
source = smtp.message(mesgt)
if not r then
print("send ok!")
使用 LuaSocket 还算简单吧,直接用 require 函数加载进来就行,在例如下面几个例子
1)输出一个 LuaSocket 版本信息:
local socket = require("socket")
print(socket._VERSION)
2)以 socket 的方式访问获取百度首页数据:
local socket = require("socket")
local host = ""
local file = "/"
-- 创建一个 TCP 连接,连接到 HTTP 连接的标准端口 -- 80 端口上
local sock = assert(socket.connect(host, 80))
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
-- 以 1K 的字节块来接收数据,并把接收到字节块输出来
local chunk, status, partial = sock:receive(1024)
print(chunk or partial)
until status ~= "closed"
-- 关闭 TCP 连接
sock:close()
3)使用模块里内置的 http 方法来访问:
local http = require("socket.http")
local response = http.request("/")
print(response)
一个简单的 client/server 通信连接
本来想写成单 server 多 client 的 socket 聊天服务器,不过最后还是卡在客户端的数据更新上,单进程的 while 轮询(poll),一个&&就把服务器数据接收给截断了。
仅靠现有的 LuaSocket 模块不装其他第三方模块,也是很难做一个实时的聊天,虽然有&&在苦苦支撑,但是这还是一个填不平的坑来了。
可能用上面向并发的&&模块会解决这个数据接收阻塞问题,这个以后再看看,现阶段的成果是:在客户端的终端上敲一些东西后回车会通过 socket 给服务器发送数据,服务器接收到数据后再返回显示在客户端的终端上。
一个简单的东西,纯属练手,代码如下:
-- server.lua
local socket = require("socket")
local host = "127.0.0.1"
local port = "12345"
local server = assert(socket.bind(host, port, 1024))
server:settimeout(0)
local client_tab = {}
local conn_count = 0
print("Server Start " .. host .. ":" .. port)
while 1 do
local conn = server:accept()
if conn then
conn_count = conn_count + 1
client_tab[conn_count] = conn
print("A client successfully connect!")
for conn_count, client in pairs(client_tab) do
local recvt, sendt, status = socket.select({client}, nil, 1)
if #recvt & 0 then
local receive, receive_status = client:receive()
if receive_status ~= "closed" then
if receive then
assert(client:send("Client " .. conn_count .. " Send : "))
assert(client:send(receive .. "\n"))
print("Receive Client " .. conn_count .. " : ", receive)
table.remove(client_tab, conn_count)
client:close()
print("Client " .. conn_count .. " disconnect!")
-- client.lua
local socket = require("socket")
local host = "127.0.0.1"
local port = 12345
local sock = assert(socket.connect(host, port))
sock:settimeout(0)
print("Press enter after input something:")
local input, recvt, sendt, status
while true do
input = io.read()
if #input & 0 then
assert(sock:send(input .. "\n"))
recvt, sendt, status = socket.select({sock}, nil, 1)
while #recvt & 0 do
local response, receive_status = sock:receive()
if receive_status ~= "closed" then
if response then
print(response)
recvt, sendt, status = socket.select({sock}, nil, 1)
欢迎来到 318骑行 小站init_by_lua
set_by_lua
server, server if, location, location if
rewrite_by_lua
http, server, location, location if
access_by_lua
http, server, location, location if
content_by_lua
location, location if
header_filter_by_lua
http, server, location, location if
body_filter_by_lua
http, server, location, location if
log_by_lua
http, server, location, location if
init_by_lua:
在nginx重新加载配置文件时,运行里面lua脚本,常用于全局变量的申请。
例如lua_shared_dict共享内存的申请,只有当nginx重起后,共享内存数据才清空,这常用于统计。
set_by_lua:
设置一个变量,常用与计算一个逻辑,然后返回结果
该阶段不能运行Output API、Control API、Subrequest API、Cosocket API
rewrite_by_lua:
在access阶段前运行,主要用于rewrite
access_by_lua:
主要用于访问控制,能收集到大部分变量,类似status需要在log阶段才有。
这条指令运行于nginx access阶段的末尾,因此总是在 allow 和 deny 这样的指令之后运行,虽然它们同属 access 阶段。
content_by_lua:
阶段是所有请求处理阶段中最为重要的一个,运行在这个阶段的配置指令一般都肩负着生成内容(content)并输出HTTP响应。
header_filter_by_lua:
一般只用于设置Cookie和Headers等
该阶段不能运行Output API、Control API、Subrequest API、Cosocket API
body_filter_by_lua:
一般会在一次请求中被调用多次, 因为这是实现基于 HTTP 1.1 chunked 编码的所谓“流式输出”的。
该阶段不能运行Output API、Control API、Subrequest API、Cosocket API
log_by_lua:
该阶段总是运行在请求结束的时候,用于请求的后续操作,如在共享内存中进行统计数据,如果要高精确的数据统计,应该使用body_filter_by_lua。
该阶段不能运行Output API、Control API、Subrequest API、Cosocket API
Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序。
Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是
post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.
post-read:
读取请求内容阶段
Nginx读取并解析完请求头之后就立即开始运行
例如模块 ngx_realip 就在 post-read 阶段注册了处理程序,它的功能是迫使 Nginx 认为当前请求的来源地址是指定的某一个请求头的值。
server-rewrite
Server请求地址重写阶段
当 ngx_rewrite 模块的set配置指令直接书写在 server 配置块中时,基本上都是运行在 server-rewrite 阶段
find-config
配置查找阶段
这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间的配对工作。
Location请求地址重写阶段
当 ngx_rewrite 模块的指令用于 location 块中时,便是运行在这个 rewrite 阶段。
另外,ngx_set_misc(设置md5、encode_base64等) 模块的指令,还有 ngx_lua 模块的 set_by_lua 指令和 rewrite_by_lua 指令也在此阶段。
post-rewrite
请求地址重写提交阶段
由 Nginx 核心完成 rewrite 阶段所要求的“内部跳转”操作,如果 rewrite 阶段有此要求的话。
访问权限检查准备阶段
标准模块 ngx_limit_req 和 ngx_limit_zone 就运行在此阶段,前者可以控制请求的访问频度,而后者可以限制访问的并发度。
访问权限检查阶段
标准模块 ngx_access、第三方模块 ngx_auth_request 以及第三方模块 ngx_lua 的 access_by_lua 指令就运行在这个阶段。
配置指令多是执行访问控制性质的任务,比如检查用户的访问权限,检查用户的来源 IP 地址是否合法
post-access
访问权限检查提交阶段
主要用于配合 access 阶段实现标准 ngx_http_core 模块提供的配置指令 satisfy 的功能。
satisfy all(与关系)
satisfy any(或关系)
配置项try_files处理阶段
专门用于实现标准配置指令 try_files 的功能
如果前 N-1 个参数所对应的文件系统对象都不存在,try-files 阶段就会立即发起“内部跳转”到最后一个参数(即第 N 个参数)所指定的 URI.
内容产生阶段
Nginx 的 content 阶段是所有请求处理阶段中最为重要的一个,因为运行在这个阶段的配置指令一般都肩负着生成“内容”
并输出 HTTP 响应的使命。
日志模块处理阶段
转载请注明: &
版权所有,保留一切权利 ·源代码可以通过git clone&& 获取;1、golang对c提供的接口在sandbox.go中:func&GetURIPath(ptr&unsafe.Pointer)&*C.char&
func&ReadBodyData(ptr&unsafe.Pointer)&(body&*C.char,&n&int)
func&WriteData(ptr&unsafe.Pointer,&data&*C.char,&n&C.int)&C.int2、c对lua提供的接口在sandbox.h中:int&get_uri_path(lua_State&*L);
int&read_body_data(lua_State&*L);
int&write_data(lua_State&*L);3、c对golang提供的接口在sandbox.h中:void&*init_lua();
int&load_lua_file(void&*p_luaCtx,&const&char&*p_pszFilename);
int&process_request(void&*p_luaCtx,&void&*p_reqCtx);
void&uninit(void&*p_luaCtx);4、lua实现http业务示例:function&process_request(reqCtx)
&&&&local&uri_path&=&go.get_uri_path(reqCtx)
&&&&print(uri_path)
&&&&local&count&=&go.write(reqCtx,&uri_path)
&&&&if&count&~=&string.len(uri_path)&then
&&&&&&&&print(&write&count&is&,&count,&&length&of&uri_path&is&,&string.len(uri_path))
end&&&&在lua中可以通过go包访问c接口,通过get_uri_path获取uri path,通过uri path区分业务类型,通过go.read_body_data获取请求的包体,通过go.write返回客户端数据;5、配置文件示例:&&&&[ngxfmd]&&&&error_log = true&&&&access_log=true&&&&fastcgi_listen_addr = &:11000&&&&&http_listen_addr = &:11001&& & [sandbox]&&&&lua_filename = &/root/myopensrc/ornet/anyd/src/service/sandbox/examples/test.lua&&&&&通过以上方式就可以在test.lua文件中实现http业务;6、请求示例:&&&&curl -v http://localhost:11001/sandbox/test后续会继续更新该开源项目,以更方便的使用lua扩展业务;本文来自:感谢作者:shawn chen查看原文:Golang语言社区(Golangweb) 
 文章为作者独立观点,不代表微头条立场
的最新文章
这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个在Linux网络编程中,常常使用select和poll来做事件触发,监听socket的读写状态,然后进行读写线上遇到了一个比较特殊的连接,它的源目的IP和端口完全相同,复现的场景是:同一个机器上的两个模块A和B通信,现象重现在linux主机下运行下面的python脚本,等待一会即可出现。import socketimpor介绍涵盖内容:为载入和保存方法创建一个数据结构体引用http包来创建一个web应用引用template包来处MySQL动态hash结构1.常用的实现方式
前一段时间一直在研究mysql中的hash结构,大概Memcached依赖于libevent,网络模型是典型的reactor模式,主线程通过自己的event_b服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(Blocking IO)5、使用事件驱动库libevent的服务器模型Libevent 是一种高性能事件循环/事件驱动库。为了实际处一些概念:同步和异步同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮转自:/2012/03/small-problem-about-g转自:/p/golang-china/wiki/go_mem简概述我一直在找一种好的方法来解释 go 语言的并发模型:不要通过共享内存来通信,相反,应该通过通信来共享内存WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的gServer的解耦—通过Router+Controller实现逻辑分发在实际的系统项目工程中中,我们在写代码本文实例讲述了Go语言实现AzDG可逆加密算法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下:p本文实例讲述了Go语言单链表实现方法。分享给大家供大家参考。具体如下:1. singlechain.go代码文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os本文实例讲述了GO语言常用的文件读取方式。分享给大家供大家参考。具体分析如下:Golang 的文件读取方法很我们为什么需要并发程序?资源利用率 :从整个程序的执行角度来看,程序执行时可以看作是对输入的数据进行计算处理runtime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.G简介:本文主要是针对一些对于goroutine的“指控”提出我自己的看法,特别是轩脉刃的一篇博客文章《论go在协议处理时,在正规处理流程之外想利用channel来做一个类似listener的机制,就是发现如果有lis在golang-nuts上看到有人问怎么样去枚举一个map。在go语言层面,并不支持支持枚举map,也就是说简介:本文讨论在设计一个包的导出接口时遇到的问题以及所采取的解决思路和方法,并提供了模拟代码作为例子。假设有简介:本文描述了使用Go语言实现的、适应于Go语言并发模型的一种支持多路复用的网络协议处理框架,并提供了框架最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌上网查了下相关资料,基本上都介绍的是\robfig\cron这个包来执行定时任务,试了下上一篇文章讲了go与C基本类型转换(http://blog.csdn.net/freeape/article服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器。按处理方式来分有循环服务器和并发服务器。1、修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简要说明所用到的数据结构和函数:所用本文讲述的TCP服务器是模仿memcache中的TCP网络处理框架,其中是基于libevent网络库的。主线前段时间在golang-China读到这个贴:有木人用(或打算)golang做游戏服务器端?
个人觉得gos := strings.Split("", "")
fmt.Println(s, len(s))
反射获取对象的属性,值,方法package mainimport "fmt"import "reflectCopier 是 Golang 的复制版,它从一个结构复制到了另一个结构。它具有以下特点:如果名字匹配,就从本篇较长较枯燥,请保持耐心看完。前面两章介绍了一下倒排索引以及倒排索引字典的两种存储结构,分别是 跳跃表 和本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一『翻译』的一个Golang的通用对象池,放到 github Go Commons Pool开源出来。之所以叫原文
/?p=616 在实际使用go语言的过程中,碰到很多朋友在现实生活中,不知道http协议 /course/te如何选择web框架:首先Golang语言开发web项目不一定非要框架,本身已经提供了Web开发需要的一切必要Go 1.7正式发布,编译器引入SSA,Go程序执行时间可减少5-35%。介绍涵盖内容:为载入和保存方法创建一个数据结构体引用http包来创建一个web应用引用template包来处package main import (
"compress/zlib"
"现如今,Go语言越来越受到开发者的追捧,比如一些流行的项目包括Docker、Heroku's Force.c一个特定类型的方法和操作函数是并发安全的,那么所有它的访问方法和操作都是并发安全的。导出包级别的函数一般情况问题起因在分布式存储开源项目 Weed-FS 中, 我发现了一个地方非并发安全(not concurrencGolangwebGo 语言社区专业的Go语言开发社区,除此之外我们还研发了Go 社区APP,让用户随时随地可以了解Go语言的行业动态。热门文章最新文章GolangwebGo 语言社区专业的Go语言开发社区,除此之外我们还研发了Go 社区APP,让用户随时随地可以了解Go语言的行业动态。

我要回帖

更多关于 httpdns域名解析 java 的文章

 

随机推荐