gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:54:49 26 4
gpt4 key购买 nike

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

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

顺便说一句,sock 是原始套接字。

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

最佳答案

当您不确定 go 中的某些内容时,一个好的经验法则是“检查源代码”,尤其是在涉及系统调用的地方。我怀疑缺少文档是半故意的,因为如前所述,它不是推荐的界面 - 最好将 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
}

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

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) 中的 stub ,但 SockaddrInet4 已准备就绪:

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

只需填写Port和Addr即可。

关于go - 如何填写 syscall.Sockaddr 结构,以便以后可以将其与 syscall.Bind 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com