【发布时间】:2017-01-18 20:30:14
【问题描述】:
我希望能够在 Go 中将一个主机地址(让我们使用“www.google.be”)转换为 sockaddr 结构,然后从 C 代码中使用它。
使用http://github.com/jbenet/go-sockaddr 模块将主机地址转换为 sockaddr_any 结构并不难。我的代码有效,如下所示:
ipAddr, _ := net.ResolveIPAddr("ip", "www.google.be")
sockAddr := sockaddrnet.IPAddrToSockaddr(ipAddr)
rawSockaddr, socklen, _ := sockaddr.SockaddrToAny(sockAddr)
cStruct := sockaddr.AnyToCAny(rawSockaddr)
C.printPointer(cStruct)
但是,我不能从我的 C 代码中使用这个 *sockaddr.C.struct_sockaddr_any 变量:cStruct(它的定义不完整,所以我不能使用它的任何字段),如下所示:
// #include <stdio.h>
// void printPointer(struct sockaddr_any *p){
// printf(":: %p :: ", p);
// // How to use P as a sockaddr?
// }
import "C"
sockaddr_any 在 Go 语言的核心中定义(来自 https://golang.org/src/syscall/types_linux.go)。所以,我相信它应该默认与我的 C 代码链接。但是,这似乎不是真的。有人知道我可以使用哪一行来包含 go 语言本身的标头(这里是系统调用结构)。
非常感谢
【问题讨论】:
标签: c linux networking go system-calls