Computer Science/유닉스프로그래밍

[유닉스 시스템 프로그래밍] Ch11. 소켓 프로그래밍 기초

계속지나가기 2020. 12. 9. 22:44
반응형

(본 강의 노트는 한빛 아카데미의 <유닉스 시스템 프로그래밍> 책을 기반으로 하고 있습니다)

[유닉스 시스템 프로그래밍] 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 : 메시지를 보내는 호스트의 주소

소켓 함수의 호출 순서

 

 

반응형