go x/net/ipv4: 在darwin-amd64上的IP头部存在错误的字节序

gj3fmq9x  于 5个月前  发布在  Go
关注(0)|答案(5)|浏览(50)

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

$ go version
go version go1.11.5 darwin/amd64

这个问题在最新版本中是否会重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/rhuang/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/rhuang/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.11.5/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.11.5/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/xy/qpsgj2816g97b0ctzkq0ps_r0000gs/T/go-build097375093=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

使用x/net/ipv4/header对IPv4 IP头部进行编组,但我得到的是小端字节序而不是大端字节序。

你期望看到什么?

得到大端字节序的IP头部长度。

你实际上看到了什么?

小端字节序。
查看代码https://github.com/golang/net/blob/master/ipv4/header.go#L71,对于darwin(苹果),32位/64位操作系统应该有不同的转换。
Darwin amd64是小端字节序,它应该进行转换。

dsf9zpds

dsf9zpds2#

你能给我们展示一个我们可以用于重现问题的自包含程序吗?

ep6jt1vc

ep6jt1vc3#

这是一个重新创建问题的程序。$x_{1e0f1}^{x}$

bvjveswy

bvjveswy4#

@gopherbot add "help wanted"
@gopherbot add OS-Darwin
cc @odeke-em

uz75evzq

uz75evzq5#

你可以看到这个答案:https://stackoverflow.com/a/15881825/13019406
这是BSD和OSX的特性,golang应该直接从sock中读取它。
你应该使用ipv4.ParseHeader来解析原始字节,而不是让golang修改为大端IP头长度。

相关问题