더보기
Part 01
Ch. 01. Socket Network Programming
Ch. 02. File Descriptor, open(), close(), write(), read()
Ch. 05. Network Byte Order, Big Endian, Little Endian
Part 2
Ch.10.
Ch.11.
Ch.12.
Ch.13.
Ch.14.
Ch.15.
Ch.16.
Ch.17.
Ch.18.
TCP/IP Protocol Stack
Application : 구현
TCP/UDP : 전송 제어, 신뢰성 부여
IP : 경로 선택, 하나의 데이터 패킷 관점
Link : LAN, WAN, MAN 등 물리 계층
TCP 기반 Server, Client
Server Side
listen()
#include <sys/type.h>
int listen(int sock, int backlog);
// 성공시 0, 실패시 -1
// sock : 연결 대기 상태에 두고자 하는 소켓의 파일 디스크립터 전달
// backlog : 연결요청 대기 큐(Queue)의 크기정보 전달, 5가 전달되면 연결요정을 5개까지 대기
listen()이 호출되면 해당 소켓이 대기상태가 되며, 두번째 인자의 크기만큼 클라이언트의 요청을 큐에 대기시킨다.
역할 : 클라이언트의 connect()를 받아들이고 큐(Queue)에 정보 저장
accept()
#include <sys/socket.h>
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
// 성공 시 생성된 소켓의 파일 디스크립터, 실패시 -1 반환
// sock : 서버 소켓의 파일 디스크립터 전달
// addr : 연결요정 한 클라이언트의 주소정보
// addrlen : addr의 변수 크기를 바이트 단위로 전달
accept() 역할 : listen() 대기 큐의 클라이언트 connect() 주소정보를 통해 연결 요청을 수락
데이터를 주고받을 준비 완료
Client side
connect()
#include <sys/socket.h>
int connect(int sock, const struct sockaddr *servaddr, socklen_t addrlen);
// 성공시 생성된 소켓의 파일 디스크립터, 실패시 -1
// sock 클라이언트 소켓의 파일 디스크립터 전달.
// servaddr 연결요청 할 서버의 주소정보를 담은 변수의 주소 값 전달
// addrlen 두번째 매개변수 servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달
connect()함수가 호출되면 1. 서버에 의해 연결요청이 접수되거나, 2. 네트워크 오류
주의할 점은, '연결요청의 접수'는 accept()함수의 호출이 아닌, queue에 등록된 상황이다.
client IP, Port
클라이언트는 bind 와 같이 IP와 Port를 직접적으로 명시하지 않아도 IP는 호스에 할당된 값으로, Port는 임의로 선택된다.