gpt4 book ai didi

c - Go 语言使用 C 的内部结构

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:15 25 4
gpt4 key购买 nike

我希望能够在 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(它的定义不完整,所以我可以't 使用它的任何字段),如下所示:

// #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 语言本身的 header (这里是系统调用结构)。

非常感谢

最佳答案

你可以使用 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)];
};

关于c - Go 语言使用 C 的内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41728874/

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