私はコマンドラインからのアドレスで提供されるUDPソケットプログラムを書いています。Sockaddr共用体とgetaddrinfo()
私はsendaddとwriteを簡単にするために、アドレスをsockaddr構造体(sockaddr_inまたはsockaddr_in6)に変換するためにgetaddrinfoを使用しています。私は、彼らが厳しいエイリアシングの問題を隠して回避するためにポインタをすることはできません理解したよう
typedef union address
{
struct sockaddr s;
struct sockaddr_in s4;
struct sockaddr_in6 s6;
struct sockaddr_storage ss;
} address_t;
:今、私はsockaddrsの組合を使用する必要があることを理解しています。私はシームレスにこのADDRESS_TへのgetaddrinfoのADDRINFOからの情報を入れてトラブルを抱えている:
struct addrinfo hint, *serv = NULL;
address_t addr;
hint.ai_family = AF_UNSPEC;
hint.ai_flags = 0;
hint.ai_socktype = SOCK_DGRAM;
hint.ai_protocol = IPPROTO_UDP;
ret = getaddrinfo(address_sr.c_str(), s_port.c_str(), &hint, &serv);
//address_sr and s_port are strings with the address and port
switch (serv->ai_addr) {
case AF_INET: {
addr->s4 = * (sockaddr_in*) serv->ai_addr;
//Here I want to fill the address_t struct with information
//This line causes a segfault
}
break;
case AF_INET6: {
addr->s6 = * (sockaddr_in6*) serv->ai_addr;
//Conversion here
}
break;
をまた、メモリコピー:
memcpy(&addr, serv->ai_addr, serv->ai_addrlen);
もセグメンテーションフォルトを引き起こします。
これをどのように正確に行う必要がありますか?私は十数通りの方法を試しましたが、私はそれを理解できません。どのようにaddrinfoからのアドレスをこの共用体に置くのですか? sockaddr_storageまたはsockaddr_insを使用しますか?
EDIT:明快さと追加のコード情報のための編集。
いくつかの 'のmemcpy()'操作の代わりに、割り当て多分? – user0042
おそらく、何らかのエラーチェックをすることが役に立ちます。 servがnullの場合はどうなりますか? –