struct sockaddr_in 구조체
sockaddr_in 구조체는 IP와 PORT 정보를 담는 구조체이다.
Define of sockaddr_in struct
struct sockaddr_in { /** 담길 정보 **/ sa_family_t sin_family; // 주소체계 (AF_INET:IPv4) uint16_t sin_port; // port번호 > uint16_t로도 정의되어있음 struct in_addr sin_addr; // 32비트 IP주소 char sin_zero[8]; // 사용되지 않음 }
-
Define of in_addr struct
struct in_addr { /** 담길 정보 **/ in_addr_t s_addr; // 32비트 IPv4 인터넷 주소 // > uint32_t로 정의되어있음 }
sockaddr_in 구조체 멤버 분석
멤버 | 정보 | ||||||||
sin_family | º 주소체계 정보 저장
|
||||||||
sin_port | º 16비트 PORT정보 저장 º 네트워크 바이트 순서로 저장 ( using htonl(), htons() etc…) |
||||||||
sin_addr | º 32비트 IP주소 정보 저장 º 네트워크 바이트 순서로 저장 (using inet_addr() ) º sin_addr의 구조체 자료형 in_addr 사싱상 32비트 정수 자료형 |
||||||||
sin_zero | º 특별한 의미를 지니지 않은 맴버 º 0으로 채워야 하는데 memset()으로 0을로 채워짐 |
Example sockaddr_in
IP와 PORT할당을 위해 bind() 함수의 인자로 사용됨
struct sock_addr
…
if(bind(sock, (struct sockaddr *) &sock_addr, sizeof(sock_addr)) == -1 )
{ …
what is difference sockaddr?
sockaddr의 구조체는 아래와 같다.
struct sockaddr { sa_family_t sa_family; char sa_data[14]; }
위에 각각의 멤버는 주소체계를 저장하는 변수(sa_family) IPv4를 저장하는 변수(sa_data)가 존재하지만 IP통신에서 Port정보를 표현하기 힘들어 sockaddr_in을 주로 사용한다.
구현 예제
>> IP가 112.170.203.147이고 Port가 80인 곳으로 연결 혹은 데이터를 보내라.
... struct sockaddr_in addr; char *sock_ip = "112.170.203.147" // IP주소 문자열 선언 char *sock_prot ="80" // PORT번호 문자열 선언 memset(&addr, 0, sizeof(addr)); // 구조체 변수 addr의 모든 멤버 0으로 초기화 addr.sin_family=AF_INET; // 주소체계 지정 addr.sin_addr.s_addr=inet_addr(sock_ip);// 문자열 기반 IP주소 초기화 addr.sin_port=htons(atoi(sock_port)); // 문자열 기반 PORT주소 초기화 ...
+ INADDR_ANY
... struct sockaddr_in addr; char *sock_prot ="80" // PORT번호 문자열 선언 memset(&addr, 0, sizeof(addr)); // 구조체 변수 addr의 모든 멤버 0으로 초기화 addr.sin_family=AF_INET; // 주소체계 지정 addr.sin_addr.s_addr=inet_addr(INADDR_ANY); // 현재 실행중인 컴퓨터의 IP입력 addr.sin_port=htons(atoi(sock_port)); // 문자열 기반 PORT주소 초기화 ...
서버 프로그램에서 주로 사용되는 INADDR_ANY는 현재 실행 중인 컴퓨터의 IP를 소켓에 부여 할 때 사용된다.