336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



sockaddr 구조체

: 소켓 주소를 표현하는 구조체

TCP/IP만을 목적으로 만들어진 것이 아니기 때문에, 다양한 주소체계에 맞게 범용 목적으로 사용하기 위해 단순한 구조를 가지고 있다


struct sockaddr

{

sa_family_t sa_family;     //소켓의 주소체계

char sa_data[14]            // 해당 주소체계에서 사용하는 주소정보

}






sockaddr_in 구조체

:ipv4 주소체계에서 사용하는 구조체

소켓 프로그램은 범용 주소 구조체로 sockaddr을 사용하지만, 주소체계의 종류에 따라 별도의 전용 구조체를 만들어 사용하는게 편리하다

(Local Unix 주소 체계는 sockaddr_in을 사용한다)


- 소켓 라이브러리는 sockaddr을 사용하므로 라이브러리에  주소 정보를 넘길 떄는 sockaddr로 형변환을 하여 넘긴다.

   그러므로 구조체의 크기는 동일하다.



struct sockaddr_in

{

sin_family_t    sin_family;        //IPv4 주소체계에서 사용하므로 항상 AF_INET으로 설정

unist16_t        sin_port;            //포트번호

struct     in_addr    sin_addr    //IP주소를 나타내는 32비트 정수 타입 구조체

char                 sin_zero[8];    //sockaddr과 같은 크기를 유지하기 위해 필요한 패딩공간, 항상 0

}




struct in_addr

{

unit32_t    s_addr;        //32비트 IPv4 인터넷 주소

}



sin_family :  주소체계 (AF_INET / AF_INET6 / AF_LOCAL)

sin_port : 16비트 포트정보 (네트워크 바이트 오더 적용)

sin_addr : 32비트 IP정보 (네트워크 바이트 오더 적용)

sin_zero : 사용되지 않는 필드





Server / Client 예제


-Server


struct sockaddr_in server_address


memset(&server_address, 0, sizeof(server_address));

server_address.sin_family=AF_INET;

server_address.sin_addr.s_addr=htonl(INADDR_ANY);

server_address.sin_port=htons(PORT);


: INADDR_ANY : 서버에 연결된 네트워크 인터페이스를 목적지로 해서 들어오는 모든 자료를 수신 가능

: htonl, htons : 서버의 주소와 포트 번호는 IP헤더에 저장되어 전송되는데 이를 중계하는 라우터들은 항상 네트워크 바이트 방식,

  즉, big endian 으로 처리한다.




-Client


struct sockaddr_in client_address;


memset(&client_address, 0, sizeof(client_address));

client_address.sin_family=AF_INET;

client_address.sin_addr.s_addr=inet_addr("192.168.1.11");

client_address.sin_port=htons(PORT)


: inet_addr() : 문자열을 받아 long형 값을 반환하는데, Network 바이트 형식을 가진다. (htonl 필요없음)






Posted by af334