[Network Basic] sockaddr_in 구조체 for IPv4

struct sockaddr_in 구조체

sockaddr_in 구조체는 IPPORT 정보를 담는 구조체이다.


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 º 주소체계 정보 저장

주소체계(Address Family) 의 미
AF_INET IPv4 인터넷 프로토콜에 적용하는 주소체계
AF_INET6 IPv6 인터넷 프로토콜에 적용하는 주소체계
AF_LOCAL 로컬 통신을 위한 유닉스 프로토콜 주소체계 
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 )
{ … 

bind함수에 대한 포스트


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를 소켓에 부여 할 때 사용된다.

글의 문제가 있다면 댓글을 달아 주세요.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.