2011-11-02 88 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類型的消息。 –

相關問題