2011-11-02 84 views
0

在Windows上使用我有一个名为sock的syscall.Handle,我想绑定到一个名为“sa”的syscall.Sockaddr结构中指定的地址。如何填写syscall.Sockaddr结构以便稍后可以在syscall.Bind中使用它?

如何填写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) 
} 

回答

2

当你不确定某些东西时,一个好的经验法则是“检查源代码”,特别是系统调用的东西。我怀疑缺少文档是半故意的,因为如前所述,它不是推荐的接口 - 更好地使用网络包为便携式解决方案:)

一旦你到达源($ 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)中的存根,b ut SockaddrInet4已准备就绪:

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

只需填写端口和地址即可。

0

为什么你需要使用它? 如果你想连接到tcp/udp,只需使用net.Dial()

+0

我想加入一个多播和发送/接收PGM类型的消息。 –

相关问题