如何填写syscall.Sockaddr结构,以便以后可以与syscall.Bind一起使用?

o'a*_*uer 3 go

在Windows上使用go时,我有一个sysock.Handle,它想绑定到syscall.Sockaddr结构中指定的地址“ sock”,该地址称为“ sa”。

如何填写syscall.Sockaddr结构,以便以后可以与syscall.Bind一起使用?

顺便说一句,袜子是一个原始的套接字。

var sa syscall.Sockaddr // how to fill out this structure with my ip address???

e := syscall.Bind(sock, sa)

if e != nil {
    fmt.Println("bind error", e)
}
Run Code Online (Sandbox Code Playgroud)

sqw*_*eek 7

当您不确定要执行的操作时,一个好的经验法则是“检查源代码”,尤其是在涉及syscall的地方。我怀疑缺少文档是半故意的,因为如前所述,它不是推荐的界面-最好将net软件包用于便携式解决方案:)

到达源代码($ GOROOT / src / pkg / syscall / syscall_windows.go)后,您会注意到Sockaddr根本不是结构:

type Sockaddr interface {
        sockaddr() (ptr uintptr, len int32, err error) // lowercase; only we can define Sockaddrs
}
Run Code Online (Sandbox Code Playgroud)

因此,让我们寻找实现此接口的结构:

func (sa *SockaddrInet4) sockaddr() (uintptr, int32, error) {
func (sa *SockaddrInet6) sockaddr() (uintptr, int32, error) {
func (sa *SockaddrUnix) sockaddr() (uintptr, int32, error) {
Run Code Online (Sandbox Code Playgroud)

在我正在查看的版本(1.0.2)中,Inet6和Unix实现只是存根,但是SockaddrInet4可以使用了:

type SockaddrInet4 struct {
        Port int
        Addr [4]byte
        raw  RawSockaddrInet4
}
Run Code Online (Sandbox Code Playgroud)

只需填写端口和地址。