2012-06-12 3 views
14

누구나 (struct sockaddr *)&server의 작동 방식을 설명 할 수 있습니까? 더 큰 구조체를 더 작은 구조체로 캐스트 할 수 있습니까?구조체를 다른 구조체로 캐스트 할 수 있습니까?

// IPv4 AF_INET sockets: 
struct sockaddr_in { 
    short   sin_family; // e.g. AF_INET, AF_INET6 
    unsigned short sin_port;  // e.g. htons(3490) 
    struct in_addr sin_addr;  // see struct in_addr, below 
    char    sin_zero[8]; // zero this if you want to 
}; 

struct in_addr { 
    unsigned long s_addr;   // load with inet_pton() 
}; 

struct sockaddr { 
    unsigned short sa_family; // address family, AF_xxx 
    char    sa_data[14]; // 14 bytes of protocol address 
}; 

이 주요 프로그램은 다음과 같습니다 :

int main(int argc , char *argv[]) 
{ 
     int socket_desc; 
     struct sockaddr_in server; 

    //Create socket 
    socket_desc = socket(AF_INET , SOCK_STREAM , 0); 
    if (socket_desc == -1) 
    { 
     printf("Could not create socket"); 
    } 

    server.sin_addr.s_addr = inet_addr("74.125.235.20"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(80); 

    //Connect to remote server 
    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) 
    { 
     puts("connect error"); 
     return 1; 
    } 

    puts("Connected"); 
    return 0; 
} 
+0

관련 http://stackoverflow.com/questions/3995940/casting-one-c-structure-into-another || http://stackoverflow.com/questions/3766229/casting-one-struct-pointer-to-other-c –

답변

10

이이 Type Punning으로 대해 참조한다

는이 구조체를 참조하십시오. 여기서 두 구조는 같은 크기를 가지므로 구조체 크기에 대해서는 의문의 여지가 없습니다. 거의 모든 것을 무엇이든 던질 수 있지만 구조로 처리하는 것은 오류가 발생하기 쉽습니다.

+0

connect() 함수가'struct in_addr'에 저장된 inet_address에 액세스하는 방법은 무엇입니까? –

+0

'((struct sockaddr_in *) server-> sin_addr.s_addr)' – Benoit

+0

와 같은 것 printf ("addr : % d \ n", ((struct sockaddr_in *) 서버 -> sin_addr.s_addr)); 이 오류가 발생합니다 : socket.c : 50 : 54 : error : '->'의 잘못된 유형 인수 ('struct sockaddr_in'을 가지고 있습니다) 왜? –

3

sockaddr_in을 sockaddr에 캐스트 할 수 있지만 일반적으로 다른 struct에 any struct를 캐스팅 할 수는 없으며 모든 것이 올바르게 작동한다고 가정합니다.

6

이것은 C의 "상속"형식입니다 (따옴표에 유의하십시오). 이것은 C가 주소의 기본 데이터를 신경 쓰지 않기 때문에 효과적입니다.

이 함수는 sa_family 필드를 사용하여 함수 내부의 적절한 sockaddr_in에 캐스팅하여 실제 구조를 결정합니다.

1

C에서는 무엇이든을 던질 수 있습니다. 당신은 (struct sockaddr *)에 캐스트를 생략 할 수도 있고, 아마도 컴파일러 경고 만 받는다.

관련 문제