我希望在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语言本身的头(这里是syscall结构)。
非常感谢
发布于 2017-01-19 07:29:09
您可以使用struct sockaddr*
void printPointer(struct sockaddr_any *pp) {
struct sockaddr *p = pp->addr;
printf(":: %p :: ", p);
}由于sockaddr_any被定义为:
struct sockaddr_any {
struct sockaddr addr;
char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
};发布于 2017-01-19 08:07:14
使用Laszlo answer,我的问题有一个简单的解决方案。我们不能强制转换指针并不是因为结构sockaddr_any的定义在我的上下文中不可访问(没有访问addr字段的简单方法)。所以,我可以简单地这样做:
// #include <stdio.h>
// void printPointer(struct sockaddr_any *p){
// struct sockaddr *usable_pointer = (struct sockaddr *) p;
// }
import "C"然后,我可以像使用任何其他sockaddr变量一样使用usable_pointer。
非常感谢
https://stackoverflow.com/questions/41728874
复制相似问题