소켓의 생성(4)
이제 socket 함수의 3번째 인자를 알아보자.
3번째 인자는 최종적으로 소켓이 사용하게 될 프로토콜 정보를 전달하는 목적으로 존재한다.
우리가 socket 함수의 1번째, 그리고 2번째 인자로 프로토콜 체계와 소켓의 전송방식에 대한 정보를 전달했다.
사실 이 두개의 인자만으로도 충분히 원하는 유형의 소켓을 생성할 수 있다.
따라서 대부분의 경우, 세 번째 인자로 0을 전달하면 우리가 원하는 소켓을 생성하는데,
모든 상황에는 예외라는 게 존재한다.
다음과 같은 예외 상황에서 3번째 인자의 역할이 주어지는데
다음의 상황은 이러하다
-
" 하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우 "
즉, 더 자세한 예시로는
IPv4 프로토콜 체계를 사용하고, TCP 전송방식을 사용하지만 80 포트와 443 포트를 사용하는 경우이다.
-
이러한 동일한 프로토콜 체계와 동일한 전송방식을 사용하지만 여러 개의 포트번호를 사용하는 경우
3번째 인자를 통해서 원하는 프로토콜 정보를 조금 더 구체화해야 한다.
-
이제 지금까지 배운 내용을 토대로 소켓의 생성과정에서 socket 함수에 전달할 수 있는 인자 정보를 구성해보자.
" IPv4 인터넷 프로토콜 체계에서 동작하는 연결지향형 데이터 전송 소켓을 구성하라 "
위의 문제에 맞는 소켓 구문을 짜보면
" int tcp_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); "
이다.
그런데 위의 socket 함수의 3번째 인자를 보니 0이 아니라 IPPROTO_TCP라고 적혀 있다.
그 이유는
위의 문제에서 "IPv4 인터넷 프로토콜 체계에서 동작하는 연결 지향형 데이터 전송 소켓"
이라고 했었다.
1번째 인자에 적힌 "PF_INET"은 IPv4 프로토콜 체계를 사용한다는 의미이다.
2번째 인자에 적힌 "SOCK_STREAM"은 연결 지향형 데이터 전송을 의미한다.
3번째 인자에 적힌 "IPPROTO_TCP"는 IPv4 프로토콜 체계를 사용하면서
연결 지향형 데이터 전송방식을 사용해라 라는 이 두 가지 조건을 모두 만족시키는 프로토콜이다.
그리고 이때 생성되는 소켓을 TCP 소켓이라고 한다.
-
그렇다면 이제 다음 문제에 대한 소켓의 구문을 구성해보자.
" IPv4 인터넷 프로토콜 체계에서 동작하는 비 연결 지향형 데이터 전송 소켓 "
위의 문제에 맞는 소켓 구문을 짜 보면
" int udp_sock = socket(PF_INET, SOCK_DGREAM, IPPROTO_UDP); "
이다.
1번째 인자는 IPv4 프로토콜 체계를 사용한다 라는 의미이고,
2번째 인자는 UDP 전송 방식을 사용한다 라는 의미이다.
3번째 인자는 IPv4 프로토콜 체계를 사용하면서
비 연결 지향형 데이터 전송방식을 사용해라 라는 이 두 가지 조건을 모두 만족시키는 프로토콜이다.
-
그럼 다음 포스팅에서
초기 때 포스팅되었던 서버 프로그램과 클라이언트 프로그램이 TCP 소켓 기반의 예제이니,
이를 조금 변경해서 TCP 소켓의 전송되는 데이터의 경계가 존재하지 않는다 라는 특징을 확인해 보자.
-
참고로 다시 한번 설명하자면
데이터의 경계가 존재하지 않는다(TCP)라는 말은
송신 횟수와 수신 횟수가 서로 불일치해도 된다는 의미이다.
반대로
데이터의 경계가 존재한다(UDP)라는 말은
송신 횟수와 수신 횟수가 서로 일치해야 한다는 의미이다.
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
(리눅스) 인터넷 주소(Internet Address) (0) | 2021.02.02 |
---|---|
(리눅스) 소켓의 생성(4-1) TCP 클라이언트(client) 프로그램 구현 (0) | 2021.02.02 |
(리눅스) 소켓의 생성(3) 비 연결지향형 소켓(UDP 소켓)(SOCK_DGRAM) (0) | 2021.02.02 |
(리눅스)소켓의 생성(2-1) 소켓에 존재하는 버퍼 내의 데이터 (0) | 2021.02.02 |
(리눅스) 소켓의 생성(2) 연결지향형 소켓(TCP 소켓)(SOCK_STRAM) (0) | 2021.02.02 |