커맨드 라인에서 제공되는 UDP 소켓 프로그램을 작성하고 있습니다.Sockaddr union과 getaddrinfo()
보내기 및 쓰기가 쉬워 지도록 getaddrinfo를 사용하여 주소를 sockaddr 구조체 (sockaddr_in 또는 sockaddr_in6)로 변환합니다. 지금은 내가 sockaddrs의 조합을 사용한다는 것을 이해 :
typedef union address
{
struct sockaddr s;
struct sockaddr_in s4;
struct sockaddr_in6 s6;
struct sockaddr_storage ss;
} address_t;
나는 그들이 엄격한 앨리어싱 문제를 숨기고 피하기 위해 포인터가 될 수 없습니다 알고있는 것처럼. 나는 원활이는 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);
너무 segfault의 원인.
정확히 어떻게해야합니까? 나는 12 가지의 다른 방법을 시도했고, 나는 그것을 알아낼 수 없다. addrinfo의 주소를이 공용체에 넣으려면 어떻게해야합니까? sockaddr_storage 또는 sockaddr_ins를 사용합니까?
편집 : 명확성 및 추가 코드 정보를 위해 편집.
일부'방어 적이기()'작업을 대신 할당 : 그래서, 예를 들어, 단지
memcpy()
전체serv->ai_addr
하나의 작업에서와와switch
제거? – user0042일부 오류 검사를하는 것이 도움이 될 수 있습니다. serv가 null 인 경우 어떻게됩니까? –