Goで、1つのホストアドレス( 'www.google.be'を使用しましょう)をsockaddr構造体に変換してからCコードから使用できるようにしたいと考えています。Go言語で内部構造を使用するC
ホストアドレスをsockaddr_any構造に変換することは、http://github.com/jbenet/go-sockaddrモジュールを使用すると難しくありません。私はこの*sockaddr.C.struct_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コードからcStruct
を、(それが不完全な定義を持っているので、私はそのフィールドのいずれかを使用することはできません)、これは以下の通りである
// #include <stdio.h>
// void printPointer(struct sockaddr_any *p){
// printf(":: %p :: ", p);
// // How to use P as a sockaddr?
// }
import "C"
sockaddr_any
をhttps://golang.org/src/syscall/types_linux.goから行く言語()のコアで定義されています。だから、私はそれがデフォルトで私のCコードにリンクされるべきだと思います。しかし、それは真実ではないようです。誰かがgo言語そのもの(ここではシステムコール構造)のヘッダーを含めるためにどの行を使用できるかを知っていますか? sockaddr_anyは次のように定義されているので
void printPointer(struct sockaddr_any *pp) {
struct sockaddr *p = pp->addr;
printf(":: %p :: ", p);
}
:ラズロの答えを使用して
struct sockaddr_any {
struct sockaddr addr;
char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
};
ありがとうございました。しかし、それは動作していないようです。 Goは 'CStruct(type * sockaddr.C.struct_sockaddr_any)を_Cfunc_printPointerの引数の型* C.struct_sockaddrとして使用することはできません。可能であれば、安全でないことを避けたい。私を助ける別の考えがありますか?ありがとうございました –
さて、元の関数の署名void printPointer(struct sockaddr_any *)をそのまま使用し、4つのCコードでstruct sockadr_anyを宣言してから.addrにアクセスしてください。 – Laszlo
実際には、sockaddr_anyには不完全な型があるため、addrフィールドを使用することはできません(ヘッダーを見つけることができません)。型キャストが機能するので、問題は解決されます:) –