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

时间:2011-11-02 19:24:18

标签: go

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

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

BTW,袜子是一个原始插座。

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)
}

2 个答案:

答案 0 :(得分:5)

当你不确定某些东西时,一个很好的经验法则是“检查来源”,尤其是涉及系统调用的东西。我怀疑缺少文档是半有意的,因为如前所述,它不是推荐的界面 - 更好地将网络包用于便携式解决方案:)

一旦你到达源($ GOROOT / src / pkg / syscall / syscall_windows.go),你会注意到Sockaddr根本不是一个结构:

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

所以让我们来寻找实现这个接口的结构:

func (sa *SockaddrInet4) sockaddr() (uintptr, int32, error) {
func (sa *SockaddrInet6) sockaddr() (uintptr, int32, error) {
func (sa *SockaddrUnix) sockaddr() (uintptr, int32, error) {

Inet6和Unix实现只是我正在看的版本(1.0.2)中的存根,但是SockaddrInet4已经准备好了:

type SockaddrInet4 struct {
        Port int
        Addr [4]byte
        raw  RawSockaddrInet4
}

只需要填写Port和Addr。

答案 1 :(得分:-1)

为什么要求使用此功能? 如果要连接到tcp / udp,只需使用net.Dial()