首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go语言使用C++内部结构

Go语言使用C++内部结构
EN

Stack Overflow用户
提问于 2017-01-19 04:30:14
回答 2查看 90关注 0票数 0

我希望在Go中,能够将一个主机地址(让我们使用'www.google.be')转换为sockaddr结构,然后在C代码中使用它。

使用http://github.com/jbenet/go-sockaddr模块将主机地址转换为sockaddr_any结构并不太难。我的代码运行正常,如下所示:

代码语言:javascript
复制
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 (它的定义不完整,所以我不能使用它的任何字段),如下所示:

代码语言:javascript
复制
// #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结构)。

非常感谢

EN

回答 2

Stack Overflow用户

发布于 2017-01-19 07:29:09

您可以使用struct sockaddr*

代码语言:javascript
复制
void printPointer(struct sockaddr_any *pp) {
    struct sockaddr *p = pp->addr;
    printf(":: %p :: ", p); 
}

由于sockaddr_any被定义为:

代码语言:javascript
复制
struct sockaddr_any {
   struct sockaddr addr;
   char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
};
票数 1
EN

Stack Overflow用户

发布于 2017-01-19 08:07:14

使用Laszlo answer,我的问题有一个简单的解决方案。我们不能强制转换指针并不是因为结构sockaddr_any的定义在我的上下文中不可访问(没有访问addr字段的简单方法)。所以,我可以简单地这样做:

代码语言:javascript
复制
// #include <stdio.h>
// void printPointer(struct sockaddr_any *p){
//     struct sockaddr *usable_pointer = (struct sockaddr *) p; 
// }
import "C"

然后,我可以像使用任何其他sockaddr变量一样使用usable_pointer

非常感谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41728874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档