[2024.10.28] 필수 온라인 강의 Part4 시스템 프로그래밍 CH04 소켓 프로그래밍
소켓
소켓 (socket) 네트워크를 경유하는 프로세스 간 통신의 종착점 - 우체통이라고 생각하는 게 편함!!! 전송계층 위에, 운영계층 아래에 위치함 - 송신지 프로세스는 메세지를 소켓으로 보내고 수신지 프로세스는 메세지를 소켓에서 읽는다 * 파일 입출력과 비슷!!! 소켓 == 특별한 파일!!!!! 으로 인식
소켓의 구성 요소 - TCP + IP 혹은 UDP + IP - 출발지 IP 주소 - 출발지 포트 번호 - 목적지 IP 주소 - 목적지 포트 번호
소켓 프로그래밍 ≒ 파일 입출력 - 소켓은 특별한 형태의 파일이라 볼 수 있다 - 파일 열기, 닫기, 쓰기, 읽기 - 소켓 열기, 닫기, 송신하기, 수신하기
-> 소켓 통신 = 프로세스 간 통신 - 소켓은 프로세스 간 통신 기법(IPC)의 일종이다 - 수신 프로세스 & 송신 프로세스
TCP 소켓 프로그래밍의 큰 그림
- socket(): 소켓을 생성 - bind(): 호스트의 IP 주소를 소켓에 연결 - listen(): LISTEN 상태로 전환 - accept(): 연결 요청 수락 - connect(): 연결 요청 - recv() / send(): 소켓으로 송수신 • close(): 소켓 닫기
소켓 생성
Parameter - domain: 통신 도메인 지정 (프로토콜 집단) - AF_UNIX, AF_LOCAL: 로컬 통신 - AF_INET: IP 버전 4 : 보통 이거 사용함 - AF_INET6: IP 버전 6 - AF_IPX: 노벨 네트워크의 통신 프로토콜 - type: 통신 방법 지정 - SOCK_STREAM: 연결형 통신 - SOCK_DGRAM: 비연결형 통신 - protocol: 특정 프로토콜 지정 -> 일반적으로 0 Return - 성공시 소켓 디스크립터 - 실패시 -1
IP 주소를 소켓에 연결
- Parameter - socketfd : 생성된 소켓 디스크립터 - my_addr : 호스트의 주소 - addrlen: my_addr의 바이트 길이 Return - 성공시 0 - 실패시 -1
LISTEN 상태(연결 요청 대기)로 전환
Parameter - socketfd: 소켓 디스크립터 - backlog: 연결 요청을 담을 큐 (다수의 연결 요청이 들어올 수 있으므로) Return - 성공시 0 - 실패시 -1
상대방 연결 요청 수락
Parameter - socketfd: 소켓 디스크립터 - addr: 연결 요청한 상대에 대한 정보 - addrlen: addr의 바이트 단위 길이 Return - 성공시 음이 아닌 정수형의 소켓 디스크립터 - 실패시 -1
연결 요청
Parameter - sockfd: 소켓 디스크립터 - serv_addr: 통신을 연결할 상대에 대한 정보 - addrlen: serv_addr의 길이
Return - 성공시 0 - 실패시 -1
메세지 송수신
Parameter - sockfd: 송수신할 소켓 디스크립터 - msg: 송수신할 메세지 - msg_len: 메세지 길이 - flags: 송수신 방법
연결 해제
Parameter - fd: 닫으려는 소켓 디스크립터 (파일 디스크립터로 close하는 것과 동일!) Return - 성공시 0 - 실패시 -1
UDP 소켓 다루기
UDP 소켓 프로그래밍의 큰 그림
- socket(): 소켓을 생성 - bind(): 호스트의 IP 주소를 소켓에 연결 - sendto(): 메세지 송신 - recvfrom(): 메세지 수신 - close(): 소켓 닫기
소켓 생성
Parameter - domain: 통신 도메인 지정 (프로토콜 집단) - AF_UNIX, AF_LOCAL: 로컬 통신 - AF_INET: IP 버전 4 - AF_INET6: IP 버전 6 - AF_IPX: 노벨 네트워크의 통신 프로토콜 - type: 통신 방법 지정 - SOCK_STREAM: 연결형 통신 - SOCK_DGRAM: 비연결형 통신 - protocol: 특정 프로토콜 지정 -> 일반적으로 0 Return - 성공시 소켓 디스크립터 - 실패시 -1
IP 주소를 소켓에 연결
Parameter - socketfd : 생성된 소켓 디스크립터 - my_addr : 호스트의 주소 - addrlen: my_addr의 바이트 길이 Return - 성공시 0 - 실패시 -1
메세지 송신
Parameter - socketfd: 소켓 디스크립터 - msg: 송신할 메세지를 저장할 공간 - len: 전송할 메세지의 길이 - flags: 송신 방식 결정 à 일반적으로 0 - to: 메세지를 송신할 상대 호스트의 정보 - tolen: to의 바이트 단위 크기 Return - 성공시 송신한 메세지의 크기 - 실패시 -1
메세지 수신
Parameter - socketfd: 소켓 디스크립터 - buf: 수신할 메세지를 저장할 공간 - len: buf의 크기 - flags: 수신 방식 결정 à 일반적으로 0 - from: 메세지를 송신한 호스트의 정보 - fromlen: from의 바이트 단위 크기 Return - 성공시 수신한 메세지의 바이트 크기 - 실패시 -1