C언어 TCP/IP 소켓 통신(1)

dumdumer·5일 전
0

소켓 분류

주소 체계로 구분

  • 유닉스 도메인 소켓 : 유닉스 상에서 같은 호스트의 다른 프로세스들 간의 통신에 사용되는 소켓. (*패밀리: AF_UNIX)
  • 인터넷 소켓 : 인터넷을 통해 다른 호스트와 통신할 때 사용. (패밀리: AF_INET)
  • *패밀리(Family) : 소켓의 주소 체계를 지정하는 개념
    • 소켓의 통신 상대방과 어떤 주소 체계로 통신할지 알려주는 역할을 한다.
    • 이 값에 따라 소켓이 해석하는 주소의 종류와 구조가 달라진다.
    • 패밀리 상수설명주소 표현 방식
      AF_INET인터넷 소켓(IPv4주소체계)32bit IP주소+16bit포트번호
      AF_UNIX유닉스 도메인 소켓파일 시스템의 경로명
      AF_INET6IPv6 주소체계IPv6주소(128bit)+포트번호
      기타블루투스(AF_BLUETOOTH) 등
    • 소켓을 생성할 때 패밀리 상수를 명확히 지정해야 운영체제가 해당 소켓에 맞는 주소 구조체와 통신 방식을 적용할 수 있다.

프로토콜에 따라 구분

  • 스트림 소켓(SOCK_STREAM)
    • TCP를 사용하는 소켓
    • 상수 SOCK_STREAM를 사용
    • TCP를 사용하기 때문에, 상대방 소켓과의 연결(Connect)과정이 필요함.
  • 데이터그램 소켓(SOCK_DGRAM)
    • UDP를 사용하는 소켓
    • 상수 SOCK_DGRAM을 사용
    • 신뢰성이나 순서 보장이 없지만, 이로 인해 빠르게 데이터를 전송해야 할 때 사용. (ex. 동영상 스트리밍)

주소체계+프로토콜 형태로 소켓 유형을 나눔

위 분류의 상수 값들을 사용해 주로 사용되는 4종류의 소켓 유형을 갖게 된다.

  • AF_INET + SOCK_STREAM : IPv4 주소체계의 TCP 통신
  • AF_INET + SOCK_DGRAM : IPv4 주소체계의 UDP 통신
  • AF_UNIX + SOCK_STREAM : 프로세스 간 TCP 통신
  • AF_UNIX + SOCK_DGRAM : 프로세스 간 UDP 통신

소켓 주소 구조체

유닉스 도메인 소켓 주소 구조체

struct sockaddr_un {
      __kernel_sa_family_t    sun_family;                   /* AF_UNIX */
      char s                  sun_path[UNIX_PATH_MAX];      /* 경로명 */
 };
  • sun_family : 소켓의 주소 체계, 패밀리 상수를 입력받는 변수
  • sun_path : 소켓 파일의 경로명, 이 경로는 파일 시스템 내에 위치하고, 프로세스 간 서로의 식별이 이루어진다.

인터넷 소켓 주소 구조체

struct sockaddr_in {
	__kernel_sa_family_t    sin_family;                /* 주소 패밀리명 */
	__be16                  sin_port;                  /* 포트 번호 */
 	struct in_addr          sin_addr;                  /* 인터넷 주소 */
 };
 
 struct in_addr {
 	__be32 s_addr; /* 32비트 주소 */
 };
  • sin_family : 주소 체계 지정
  • sin_port : 포트 번호 지정. 네트워크 바이트 오더(빅엔디안)로 지정해야 하기 때문에 htons() 를 사용해 변환해주어야 한다.
  • sin_addr : IP 주소 지정(IP주소 표현을 in_addr 구조체로 함)

ex)

struct sockaddr_in addr; // IPv4 소켓 주소 구조체
memset(&addr, 0, sizeof(addr)); // 구조체를 전부 0으로 초기화
addr.sin_family = AF_INET; // 주소체계 지정
addr.sin_addr.s_addr = inet_addr("192.168.147.129"); // IP주소 지정.
// inet_addr : 문자열 IP주소를 이진값으로 바꿔서 리턴
addr.sin_port = htons(9000); // 9000번 포트
profile
tik tok

0개의 댓글