net: LookupHost 在 GODEBUG=netdns=cgo 和 go 之间显示不同的结果,

kcwpcxri  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(94)

你使用的Go版本是什么(go version)?

go version go1.9.2 darwin/amd64

你做了什么?

package main

import (
	"net"
	"fmt"
)

func main() {
	fmt.Println(net.LookupHost("10.256"))
	fmt.Println(net.LookupHost("10.256.1"))
	fmt.Println(net.LookupHost("10.10.256"))
	fmt.Println(net.LookupHost("10.10.256.1"))
	fmt.Println(net.LookupHost("10.10.10.256"))
}

你觉得会看到什么?

这个程序在Linux和Windows上运行正常,并且显示以下输出,但在Mac上不行。

[] lookup 10.256: no such host
[] lookup 10.256.1: no such host
[] lookup 10.10.256: no such host
[] lookup 10.10.256.1: no such host
[] lookup 10.10.10.256: no such host

你实际上看到了什么?

[10.0.1.0] <nil>
[] lookup 10.256.1: no such host
[10.10.1.0] <nil>
[] lookup 10.10.256.1: no such host
[] lookup 10.10.10.256: no such host
n3h0vuf2

n3h0vuf21#

这是正确的行为,对于Linux和Mac都是一样的。
请查看inet_aton(3)手册页以获取更多详细信息:

The address supplied in cp can have one of the following forms:
....

a.b.c

Parts a and b specify the first two bytes of the binary address. Part c is interpreted 
as a 16-bit value that defines the rightmost two bytes of the binary address. 
This notation is suitable for specifying (outmoded) Class B network addresses.

a.b

Part a specifies the first byte of the binary address. Part b is interpreted as a 24-bit 
value that defines the rightmost three bytes of the binary address. This notation is 
suitable for specifying (outmoded) Class C network addresses.

谢谢。

d5vmydt9

d5vmydt92#

谢谢Gregory。我仍然对Linux和Mac之间的输出差异感到困惑。看起来Mac显示了正确的输出,而且应该是这样的,而不是Linux。

aurhwmvo

aurhwmvo3#

Linux在使用cgo解析器时可能也是如此。

zbq4xfa0

zbq4xfa04#

当GODEBUG=netdns=cgo时,通用名称解析依赖于用户空间提供的外部功能,如libc(实现之间的行为有所不同,例如,BSD变体上的libc与macOS/iOS上的libc、glibc、Windows API和Plan 9之间的行为不同)。当GODEBUG=netdns=go时,DNS名称解析仅使用包内部的帮助程序。

我认为基本上将IP字面值处理与现有的GODEBUG=netdns=go行为对齐是可以的(因为没有人会使用传统的IPv4路由),尽管我仍然想知道我们是否应该处理RFC 7050中描述的IP地址合成。在没有应用程序上下文的情况下,很难确定什么是正确的,什么是错误的。

朋友:#20790

相关问题