본문 바로가기

Programming Language/C&C++

소켓 통신 #1 - 소켓 통신에 쓰이는 구조체

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

소켓 통신 #1 - 소켓 통신에 쓰이는 구조체

- by tapito


sockaddr 구조체

소켓을 통해 여러 형태의 네트워크를 거의 비슷한 방식으로 데이터를 교환할 수 있습니다. sockaddr는 일종의 추상 클래스처럼 소켓으로 통신하기 위한 여러 네트워크의 상위 구조체입니다. sockaddr 아래 인터넷망을 사용해 통신하는 구조체인 sockaddr_in과 유닉스 운영체에서 프로세스간 통신을 위해 사용되는 sockaddr_un의 구조체가 선언되어 있습니다.

 /* sockaddr 구조체 */
struct sockaddr {
	sa_family_t sa_family;
	char sa_data[14];
};

sa_family: 소켓이 사용되는 네트워크의 종류입니다. 다음 값 중 하나가 올 수 있습니다.

    1. AF_INET: IPv4를 사용하는 인터넷망에 접속합니다.

      AF_INET6: IPv6를 사용하는 인터넷망에 접속합니다.

      AF_LOCAL: 유닉스 운영체제에서 프로세스간 통신을 수행합니다.

  • sa_data: sa_family값에 따른 최대 14바이트의 부가 정보입니다. 이 필드의 내용은 sockaddr_in과 sockaddr_un에서 구체화됩니다.

     

    sockaddr_in 구조체

    in은 internet의 앞글자입니다. 소켓을 통해 인터넷 망에 접속하기 위한 구조체입니다. AF_INET 모드에서 사용할 수 있습니다.

    /* sockaddr_in 구조체 */
    struct sockaddr_in {
    	sa_family_t sin_family; // = 항상 AF_INET
    	uint16_t sin_port;
    	struct in_addr sin_addr;
    	char sin_zero[8];
    };
    
    struct in_addr {
    	uint32_t s_addr;
    };

    sin_family: sockaddr의 sa_family와 같습니다.

    sin_port: 통신을 위해 사용할 포트 번호입니다.

    sin_addr: 접속할 대상(상대방)의 IP 주소입니다. 자료형인 in_addr 구조체는 Internet Address의 줄임 표현으로 4바이트 IP 주소를 나타냅니다.

    sin_zero: sockaddr에서 sa_data를 통해 확보한 14바이트 외 나머지 공간입니다. 항상 0이며 사용되지 않습니다.

     

    sockaddr_in6 구조체

    AF_INET6 (IPv6)를 사용하는 네트워크에 접속하기 위한 구조체입니다.

    /* sockaddr_in6 구조체 */
    struct sockaddr_in6 {
    	sa_family_t sin6_family; // = 항상 AF_INET6
    	in_port_t sin6_port;
    	uint32_t sin6_flowinfo;
    	struct in6_addr sin6_addr;
    	uint32_t sin6_scope_id;
    };
    
    struct in6_addr {
    	unsigned char s6_addr[16];
    };
    

    sin6_family: sockaddr의 sa_family와 같습니다.

    sin6_port: 통신을 위해 사용할 포트 번호입니다.

    sin6_flowinfo: 라우터가 패킷이 전달되는 경로를 결정하는데 필요한 값입니다.

    sin6_addr: 접속할 대상(상대방)의 IP 주소입니다.

    sin6_scope_id: 버전에 따라 이 멤버는 없을 수도 있습니다. IP 주소에 따른 계층이 적절한지를 검증합니다. 계층은 아래 값 중 하나입니다.

    • 0x0: reserved
      0x1: interface-local
      0x2: link-local
      0x4: admin-local
      0x5: site-local
      0x8: organization-local
      0xe: global
      0xf: reserved
  •  

    sockaddr_un 구조체

    서로 다른 프로세스(실행중인 프로그램) 사이에 데이터를 주고받아야 할 때 사용되는 구조체입니다.

    /* sockaddr_un 구조체 */
    struct sockaddr_un {
    	sa_family_t sun_family;
    	char sun_path[UNIX_PATH_MAX];
    };

    sun_family: sockaddr 구조체의 sa_family와 같습니다.

    sun_path: 소켓으로 접속할 파일의 경로입니다. UNIX_PATH_MAX는 상수 108입니다.