[유닉스 시스템 프로그래밍] Ch10. 시스템V의 프로세스간 통신
학습목표
- TCP/IP 프로토콜의 기본 개념을 이해한다.
- IP 주소와 포트번호의 개념을 이해한다.
- 소켓 관련 구조체와 함수를 이해한다.
- 소켓을 이용한 통신 프로그램을 작성할 수 있다.
목차
1. TCP/IP 개요
2. IP 주소와 호스트명
3. 포트번호
4. 소켓 프로그래밍 기초
5. 소켓 인터페이스 함수
1. TCP/IP 개요
TCP/IP 란?
- 인터넷의 표준 프로토콜
- 5계층(4계층)으로 구성
TCP와 UDP의 차이
*참고
2. IP 주소와 호스트명
IP주소와 호스트명
IP 주소 : 인터넷을 이용할 때 사용하는 주소로 점(.)으로 구분된 32비트 숫자
호스트 명 : . 시스템에 부여된 이름
호스트명(도메인 명)과 IP주소를 관리하는 서비스 -> DNS(Domain name service)
호스트명과 IP주소 변환
/etc/hosts : 파일 또는 DNS, NIS 등
/etc/nsswitch.conf : 파일에 주소변환을 누가 할 것인지를 지정
호스트명과 주소 읽어오기
- gethostent : 호스트명과 IP주소를 읽어 hostent 구조체에 저장
- sethostent : 데이터베이스의 읽기 위치를 시작위치로 재설정
- endhostent : 데이터베이스를 닫는다
hostent 구조체
호스트명/IP 주소로 정보 검색
- gethostbyname() : 호스트명으로 정보 검색
- gethostbyaddr() : IP주소로 정보 검색
3. 포트번호
포트번호
호스트에서 동작하고 있는 서비스를 구분하는 번호
2바이트 정수로 0~65535까지 사용가능
잘 알려진 포트 : 이미 정해져 있고 자주 사용하는 포트 (텔넷 23, HTTP 80, FTP 21)
관련파일: /etc/services
포트 정보 읽어오기
- getservent : 포트 정보를 읽어 servent 구조체로 리턴
- setservent : 읽기 위치를 시작으로 재설정
- endservent : 데이터베이스 닫기
서비스명으로 정보 검색
- name : 검색할 포트명
- proto : tcp 또는 udp 또는 NULL
포트 번호로 정보 검색
- proto : tcp 또는 udp 또는 NULL
4. 소켓 프로그래밍 기초
소켓의 종류
- AF_UNIX : 유닉스 도메인 소켓 (시스템 내부 프로세스간 통신)
- AF_INET : 인터넷 소켓 (네트워크를 이용한 통신)
소켓의 통신 방식
- SOCK_STREAM : TCP 사용
- SOCK_DGRAM : UDP 사용
PF와 AF
- PF : Protocol Family, AF : Address Family
- 예전에는 달랐지만 지금은 차이가 전혀 없다.
- PF의 경우 socket()에서, AF의 경우 sockaddr_in의 구조체를 설정할 때 주로 사용
소켓 주소 구조체
유닉스 도메인 소켓의 주소 구조체
- sun_family : AF_UNIX
- sun_path : 통신에 사용할 파일의 경로명
인터넷 소켓의 주소 구조체
바이트 순서 함수
- 정수를 저장하는 방식 : Big Endian, Little Endian
- Big Endian : 메모리의 낮은 주소에 정수의 첫 바이트를 위치 -> 모토로라, 썬
- Little Endian : 메모리의 높은 주소에 정수의 첫 바이트를 위치 -> 인텔
- TCP/IP 네트워크에서 바이트 순서 표준 : Big Endian
- 호스트 바이트 순서(HBO) : 시스템에서 사용하는 바이트 순서
- 네트워크 바이트 순서(NBO) : 네트워크에서 사용하는 바이트 순서
- htonl :32비트 HBO를 32비트 NBO로 변환
- htons : 16비트 HBO를 16비트 NBO로 변환
- ntohl : 32비트 NBO를 32비트 HBO로 변환
- ntohs : 16비트 NBO를 16비트 HBO로 변환
IP 주소 변환 함수
IP주소의 형태
- 192.168.10.1과 같이 점(.)으로 구분된 형태
- 시스템 내부 저장 방법 : 이진값으로 바꿔서 저장
- 외부적 사용 형태 : 문자열로 사용
문자열 형태의 IP 주소를 숫자 형태로 변환 : inet_addr()
구조체 형태의 IP 주소를 문자열 형태로 변환 : inet_ntoa()
5. 소켓 인터페이스 함수
소켓 인터페이스 함수
§ socket : 소켓 파일기술자 생성
§ bind : 소켓 파일기술자를 지정된 IP 주소/포트번호와 결합(bind)
§ listen : 클라이언트의 접속 요청 대기
§ connect : 클라이언트가 서버에 접속 요청
§ accept : 클라이언트의 접속 허용
§ recv : 데이터 수신(SOCK_STREAM)
§ send : 데이터 송신(SOCK_STREAM)
§ recvfrom : 데이터 수신(SOCK_DGRAM)
§ sendto : 데이터 송신(SOCK_DGRAM)
§ close : 소켓 파일기술자 종료
소켓 생성하기 : socket()
- domain : 소켓 종류(AF_UNIX, AF_INET)
- type : 통신방식(TCP, UDP)
- protocol : 소켓에 이용할 프로토콜
소켓에 포트 지정하기 : bind()
- name : 소켓의 이름을 표현하는 구조체
클라이언트 연결 기다리기 : listen()
- backlog : 최대 허용 클라이언트 수
연결 요청 수락하기 : accept()
- addr: 접속을 요청한 클라이언트의 IP 정보
서버와 연결하기 : connect()
- name : 접속하려는 서버의 IP 정보
데이터 보내기 : send()
데이터 받기 : recv()
UDP 데이터 보내기 : sendto()
- to : 메시지를 받을 호스트의 주소
UDP 데이터 받기 : recvfrom()
- from : 메시지를 보내는 호스트의 주소
소켓 함수의 호출 순서
'Computer Science > 유닉스프로그래밍' 카테고리의 다른 글
Pthread 개념 (0) | 2020.12.06 |
---|---|
[유닉스 시스템 프로그래밍] Ch10. 시스템V의 프로세스간 통신 (0) | 2020.11.28 |
[유닉스 시스템 프로그래밍] Ch09. 파이프 (0) | 2020.11.23 |
[유닉스 시스템 프로그래밍] Ch08. 메모리 매핑 (0) | 2020.11.16 |
[유닉스 시스템 프로그래밍] Ch07. 시그널 (0) | 2020.11.04 |