2012-12-05 3 views
3

아래 코드에서 sockaddr_in은 sockaddr 형식으로 '(struct sockaddr *) & sin'으로 변환 된 것으로 나타났습니다. 나는 sockaddr_in에있는 변수가 sockaddr에 대응하여 매핑되는 것을 알고 싶다. 다음은 스 니펫입니다.C에서 struct 유형 변환

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

//의 IPv4 AF_INET 소켓 :

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 sockaddr_in sin; 

sin.sin_family = AF_INET; 
sin.sin_port = htons(floodport); 
sin.sin_addr.s_addr = inet_addr(argv[1]); 

// 형식 변환

(struct sockaddr *) &sin // what values of sockaddr_in would be mapped to sockaddr ? 

이 변환은 다음과 같이 소켓 프로그래밍있는 sendto()에서 사용된다.

sendto(s, datagram, iph->tot_len,0, (struct sockaddr *) &sin,sizeof(sin)) 

미리 감사드립니다.

+1

그리고 정확히 귀하의 질문은 무엇입니까? – wildplasser

답변

2

struct sockaddr의 유일한 목적은 other structs 같은

    을 가지고있다,

    는 사실, 다른 목적으로 사용하지 않는 등 sendto()과 같은 기능을 주위에 전달하는 하나 개의 유형을하는 것입니다 기존에

  • struct sockaddr_in의 IPv4
  • IPv6를
  • struct sockaddr_un에 대한
  • struct sockaddr_in6 유닉스 소켓
  • 블루투스
  • struct sockaddr_storage 아키텍처에서 가장 큰 크기입니다. 모르는 유형의 주소를 저장하는 데 깔끔하게 사용할 수 있습니다.
2

만 인 sa_family 읽을 구조체 SOCKADDR를 사용하고 (그들은 인 sa_family 안에 무엇이 이해한다면) 내부적으로 반대 캐스트를 수행 기능.