2-1 프로토콜
컴퓨터 상호간의 대화에 필요한 통신 규약
혼돈의 여지가 있으면 안되고 잘 정의(FM)되어야 한다.
※ 안 좋은 예 : 서버에서 accept 하자마자 읽는 연산을 수행.
2-2 소켓의 생성
기본적인 통신 도구
프로토콜에 독립적 : 사용자가 프로토콜을 정해주어야 한다는 점에서...
데이터 전송 형태(타입)를 지정해야 한다.
2-3 프로토콜 체계
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
domain : 프로토콜 체계. family
(여러 가지 프로토콜이 합쳐져서 체계를 이룬다.)
PF_INET : IPv4 (4바이트 2^32승개의 IP)
PF_INET6 : IPv6 (16바이트 2^128승개의 IP, 약 10의 38승)
PF_LOCAL : Local 통신을 위한 UNIX 프로토콜
PF_PACKET : Low level socket을 위한 인터페이스
PF_IPX : IPX 노벨 프로토콜
※ 127.0.0.1 : loopback address
2-4 소켓의 타입
type : 형태
1. 연결지향형(connection oriented)
전송하는 순서대로 데이터가 전달.
에러나 데이터 오류 없이 전달.
전송되는 데이터의 경계가 존재하지 않는다.
=> write함수를 2번호출한다고 해서 read함수가 꼭 2번 호출될 필요가 없다.
2. 비연결지향형(connectionless)
예시) 우편이면 일반우편, 빠른 우편, 등기 등.
전송되는 순서에 상관없이 가장 빠른 전송.
데이터는 손실되고 에러가 발생할 수도 있다.
데이터의 경계가 존재하고 그 크기는 제한되어 있다.
=> write함수를 2번 호출하면 read함수가 꼭 2번 호출해야 한다.
2-5. 프로토콜의 선택
protocol : 프로토콜을 구체화할 때 필요하다. (raw_socket을 다룰 때 유용하다.)
IPPROTO_TCP : TCP를 기반으로 하는 소켓을 생성. PF_INET + SOCK_STREAM
IPPROTO_UDP : UDP를 기반으로 하는 소켓을 생성. PF_INET + SOCK_DGRAM
※ 파일 핸들도 정수형 데이터이다.
int a = socket(...); = SOCKET a = socket(...);
앞으로 소켓의 데이터 형이 바뀔 것을 대비해서 SOCKET을 사용하는 것이 좋다.
소켓의 종료
리눅스
#include<unistd.h>
int close(int filedes);
리턴 : 성공시 0, 실패시 -1
filedes : 닫아줄 파일의 파일 디스크립터
#include<winsock2.h>
int closesocket(SOCKET s);
리턴 : 성공시 0, 실패시 SOCKET_ERROR
s : 닫아줄 소켓의 핸들