2017-01-18 17 views
0

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_anyhttps://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)]; 
}; 

答えて

1

をありがとう問題。これは私の文脈では構造体sockaddr_anyの定義にアクセスできないためです(addrフィールドにアクセスする簡単な方法はありません)。ポインタをキャストできません。だから、私は単純に行うことができます。

// #include <stdio.h> 
// void printPointer(struct sockaddr_any *p){ 
//  struct sockaddr *usable_pointer = (struct sockaddr *) p; 
// } 
import "C" 

その後、私は他のsockaddr変数としてusable_pointerを使用することができます。

ありがとうございました

+0

ありがとうございました。しかし、それは動作していないようです。 Goは 'CStruct(type * sockaddr.C.struct_sockaddr_any)を_Cfunc_printPointerの引数の型* C.struct_sockaddrとして使用することはできません。可能であれば、安全でないことを避けたい。私を助ける別の考えがありますか?ありがとうございました –

+0

さて、元の関数の署名void printPointer(struct sockaddr_any *)をそのまま使用し、4つのCコードでstruct sockadr_anyを宣言してから.addrにアクセスしてください。 – Laszlo

+0

実際には、sockaddr_anyには不完全な型があるため、addrフィールドを使用することはできません(ヘッダーを見つけることができません)。型キャストが機能するので、問題は解決されます:) –

0

、私のために簡単な解決策がある

あなたはsockaddr構造体*を使用することができる非常に多くの

+0

あなたは大歓迎です。それも私の最初のアイデアでしたが、タイプキャストを避けたいと思っていました。 – Laszlo

関連する問題