현생/TCP 소켓 프로그래밍

TCP/IP 소켓 프로그래밍 함수 위주 정리

푸더기 2022. 2. 21. 19:40
반응형

 

제가 지금까지 작성해온 글들을 한 페이지에 정리해둔 것입니다. 개념을 정리한게 아닌 함수가 무엇이 있었는지 쉽게 찾기위한 정리입니다. 함수의 이름만 써져있으며, ()은 인자가 없다는게 아닌 함수라는 것을 뜻합니다. 전체 내용은 LINUX를 기반합니다.

 

 

 

프로토콜 체계와 소켓의 타입

소켓의 프로토콜 체계와 타입을 설정해서 TCP소켓 또는 UDP소켓으로 만들 수 있었다.

 

2. 소켓의 프로토콜과 타입 [TCP/IP][C][LINUX]

프로토콜이란 컴퓨터 상호간 대화에 필요한 통신규약입니다. #include int socket(int domain, int type, int protocol); // success: 파일 디스크럽터 fail: -1 sys/socket.h에서 소켓 함수는 위와 같이 구성되..

pupuduck.tistory.com


주소 정보를 담는 구조체

struct sockaddr_in

struct in_addr

 

3-2. 주소정보를 담는 구조체 sockaddr_in [TCP/IP][C][LINUX]

앞서 우리는 클라이언트와 서버를 간략하게 짜보면서 sockaddr_in이라는 구조체를 사용했습니다. 이는 주소정보를 담기 위한 구조체입니다. 이 구조체는 다음과 같이 정의되어 있습니다. struct socka

pupuduck.tistory.com


IPv4의 구조와 IP+PORT를 이용한 통신

 

3-1. IP주소와 PORT번호를 통한 데이터 전송 [TCP/IP][C][LINUX]

IP주소 체계는 IPv4와 IPv6으로 나뉩니다. 각각 4바이트 주소체계, 16바이트 주소체계를 뜻하는데 오늘날엔 아직 IPv4를 대중적으로 사용하고 있습니다. (그래서 앞으로도 IPv4를 기준으로 말합니다) I

pupuduck.tistory.com


TCP/IP 프로토콜 스택

 

4-1. TCP/IP 프로토콜 스택 [TCP/IP][C][LINUX]

TCP/IP 프로토콜 스택은 위와 같이 네 개의 계층으로 나뉩니다. TCP 소켓을 이용할 땐 TCP 계층을 포함한 네 계층, UDP 소켓을 이용할 땐 UDP 계층을 포함한 네 계층을 통해 데이터를 송수신하게 됩니

pupuduck.tistory.com


Iterative 서버 도식도

listen(), accept()

 

4-2. echo 서버와 클라이언트 구현 [TCP/IP][C][LINUX]

위 그림은 Iterative 서버의 함수호출 순서, TCP 서버-클라이언트 구현을 나타낸 것입니다. Iterative 서버란 반복문을 삽입해 accept 함수를 반복 호출해서 연결요청을 하는 모든 클라이언트에게 서비

pupuduck.tistory.com


입출력 버퍼

 

5-2 TCP 소켓의 입출력 버퍼 [TCP/IP]

TCP소켓은 데이터 송수신의 경계가 없고, 데이터의 손실이 없습니다. 그러나 서버가 보낸 데이터보다 클라이언트가 받은 데이터가 적을 수도 있고, 그의 반대일 수도 있는데 아직 받지 않은 데이

pupuduck.tistory.com


TCP 흐름 제어

 

5-3 TCP의 내부 동작 원리 (TCP 흐름 제어) [TCP/IP]

TCP 소켓이 생성되고 소멸하기까지 크게 나눠서 세 가지로 구분할 수 있습니다. - 상대 소켓과 연결 - 상대 소켓과 데이터 송수신 - 상대 소켓과의 연결 종료 먼저 소켓과의 연결 과정입니다. TCP

pupuduck.tistory.com


UDP 관련

 

6-1. UDP 소켓의 특성 [UDP/IP]

UDP는 TCP와 달리 흐름제어를 하지 않습니다. 따라서 UDP는 데이터 송수신간 신뢰할 수는 없지만 UDP는 TCP보다 훨씬 빠릅니다. (한번에 송수신하는 데이터의 양이 적을수록 둘의 간격이 커집니다. -

pupuduck.tistory.com

 

6-2. UDP 기반 간단한 서버와 클라이언트 구현 [UDP/IP][C][LINUX]

UDP에서는 TCP와 달리 연결 설정 과정이 필요 없으므로 listen 함수와 accept 함수는 사용하지 않고 UDP 소켓의 생성과 데이터의 송수신 과정만 존재합니다. 또, UDP는 하나의 소켓으로 둘 이상의 호스

pupuduck.tistory.com

 

6-3. UDP의 데이터 송수신 특성 - 데이터의 경계 [UDP/IP][C][LINUX]

UDP는 TCP와 달리 데이터의 경계가 존재하는 프로토콜입니다. 따라서 데이터의 송수신 과정에서 호출하는 입출력 함수의 호출 횟수가 큰 의미를 갖습니다. 그렇기 때문에 데이터를 전부 수신하기

pupuduck.tistory.com

 

6-4 UDP에서의 connect (connected UDP 소켓) [UDP/IP][C][LINUX]

UDP소켓에서는 데이터를 전송할 목적지의 IP와 PORT번호를 등록하지 않습니다. 그렇기 때문에 sendto 함수호출을 통한 데이터의 전송 과정은 크게 세 단계로 이루어져 있습니다. 1. UDP 소켓에 목적지

pupuduck.tistory.com


Half-close

shutdown()

 

7. TCP 기반의 Half-close : shutdown() [TCP/IP][C][LINUX]

TCP에서는 연결과정보다 중요한 것이 종료과정인데, 종료과정에서는 예상치 못한 일이 발생할 수 있기 때문입니다. close 함수 호출은 송수신을 바로 불가능하게 만드는 완전종료를 의미합니다.

pupuduck.tistory.com


도메인

 

8-1. 도메인이란? 왜 쓰는 걸까?

Domain Name System, DNS란 IP주소와 도메인 이름 사이에서의 변환을 수행하는 시스템입니다. DNS의 중심에는 DNS 서버가 존재합니다. 티스토리의 IP주소인 121.53.105.234를 직접 입력하면 티스토리의 페이

pupuduck.tistory.com


도메인 이름과 IP 상호간 변환

gethostbyname()

gethostbyaddr()

 

8-2. 도메인 이름과 IP 간의 변환 [TCP/IP][C][LINUX]

#include struct hostent* gethostbyname(const char* hostname); // success: hostent 구조체 변수의 주소값 fail: NULL 포인터 위 함수를 이용하면 문자열 형태의 도메인 이름으로 IP 주소 정보를 얻을 수 있습..

pupuduck.tistory.com


소켓 옵션 설정

getsockopt()

setsockopt()

 

9-1. 소켓의 옵션과 설정 함수 get/setsockopt [TCP/IP][C][LINUX]

지금까지 소켓을 생성하고 따로 설정을 하는 과정 없이 바로 사용해왔습니다. 이 경우 기본적으로 설정되어 있는 소켓의 특성으로써 데이터를 송수신하게 됩니다. 그러나 이미 활성화되어 있는

pupuduck.tistory.com


소켓 설정 - Time-wait 없애기

 

9-4 이미 할당된 PORT번호에 재할당하는 소켓의 옵션 [TCP/IP][C][LINUX]

이 소켓의 옵션을 소개하기 이전에, Time-wait 상태를 얘기하겠습니다. 우리가 서버를 키고 종료할 때 컨트롤-C 등으로 강제 종료하고 즉시 다시 키려고 시도하면 bind()함수에서 에러가 발생하는 모

pupuduck.tistory.com

Nagle 알고리즘과 중단

 

9-5 Nagle 알고리즘과 중단하는 소켓의 옵션 [TCP/IP][C][LINUX]

Nagle 알고리즘은 네트워크 상에서 돌아다니는 패킷들의 오버플로우를 막기 위해 1984년 제안된 알고리즘으로, 앞서 전송한 데이터에 대한 ACK 메시지를 받아야만 다음 데이터를 전송하는 알고리

pupuduck.tistory.com


다중접속 서버란, 멀티프로세스

fork()

 

10-1. 다중접속서버의 필요성과 멀티프로세스 [TCP/IP][C][LINUX]

서버가 한 번에 한 요청만 받을 수 있다면 연결요청이 무수히 쌓였을 때 후순위에 있는 요청은 받아들여지기까지 긴 시간이 걸릴 것입니다. 또, 네트워크 프로그램은 데이터의 송수신 시간이 큰

pupuduck.tistory.com


좀비프로세스란 - 프로세스의 종료와 반환값 확인

wait()

waitpid()

 

10-3 좀비 프로세스 해결법 [TCP/IP][C][LINUX]

프로세스가 할 일을 다 하고도 사라지지 않고 리소스를 차지하고 있는 모습을 가리켜 좀비 프로세스라고 합니다. fork() 함수의 호출로 생성된 프로세스를 종료하는 방법은 인자를 전달하면서 exi

pupuduck.tistory.com


시그널핸들링이란 - 프로세스가 종료되면 함수 호출

signal()

alerm()

sigaction()

 

10-4 시그널 핸들링 - signal [C][LINUX]

부모 프로세스에서 자식 프로세스의 종료를 계속 확인하기에는 비효율적입니다. 자식 프로세스의 종료를 인식하는 주체는 운영체제이므로 운영체제가 부모 프로세스에게 자식 프로세스의 종

pupuduck.tistory.com

 

10-5 시그널 핸들링 - sigaction, 좀비 프로세스 해결 [TCP/IP][C][LINUX]

sigaction 함수는 signal 함수를 대체할 수 있고 더 안정적입니다. sigaction 함수는 유닉스 계열 운영체제 별 동작방식에 따른 차이를 보이지 않기 때문입니다. 따라서 요즘은 signal 함수 대신 sigaction

pupuduck.tistory.com


입출력 루틴 분할 이점

 

10-7 TCP의 입출력 루틴 분할 [TCP/IP][C][LINUX]

이 글에는 멀티프로세스 생성 방법에 대한 설명 없이 응용만 합니다. 따라서 멀티프로세스 생성 방법 등은 아래를 참고해주세요. https://pupuduck.tistory.com/63 https://pupuduck.tistory.com/66 지금까지 구..

pupuduck.tistory.com


파이프란?

pipe()

 

11. 파이프 기반의 프로세스간 통신 [TCP/IP][C][LINUX]

fork 함수를 통해 복사된 자식 프로세스는 부모 프로세스와 메모리 공간을 공유하지 않으므로 프로세스간 통신은 운영체제의 도움으로 이루어져야 합니다. 이 때 사용하는 것이 파이프입니다.

pupuduck.tistory.com


멀티플렉싱 - select

select()

 

12. 멀티플렉싱과 select 함수 [TCP/IP][C][LINUX]

멀티플렉싱이란 하나의 통신채널을 통해 둘 이상의 데이터를 전송하는데 사용되는 기술입니다. 앞서 사용한 멀티프로세스와 달리 프로세스를 생성하지 않고 다수의 클라이언트에게 서비스를

pupuduck.tistory.com


다양한 입출력 함수

write()/read()

send()/recv()

writev()/readv()

 

13. 다양한 입출력 함수 [TCP/IP][C][LINUX]

write & read 지금까지 써온 입출력 함수입니다. 리눅스에선 소켓을 파일처럼 다룰 수 있다는 점을 이용해 파일 입출력 함수를 사용해왔습니다. #include //입력 함수 - success: 전달한 바이트 수, fail: -1

pupuduck.tistory.com


멀티캐스트와 브로드캐스트

 

14. 멀티캐스트와 브로드캐스트 [TCP/IP][C][LINUX]

멀티캐스트 멀티캐스트 서버가 멀티캐스트 그룹에게 데이터를 전송하면 그룹의 클라이언트는 모두 데이터를 수신합니다. 멀티캐스트 그룹의 수는 IP 주소 범위 내에서 무제한으로 추가할 수 있

pupuduck.tistory.com


표준 입출력 함수와 파일 디스크립터 간 비교 및 변환

fdopen()

fileno()

 

15. 표준 입출력 함수와 파일 디스크립터의 비교 및 변환 [TCP/IP][C][LINUX]

표준 입출력 함수의 장점은 이식성이 좋고, 버퍼링을 통해 성능을 향상시킬 수 있습니다. 소켓을 생성할 때 운영체제는 입출력을 위한 버퍼를 생성하는데, 표준 입출력 함수를 사용하면 추가 버

pupuduck.tistory.com


FILE포인터에서의 Half-close

dup()

dup2()

 

16. 파일 포인터 기반 입출력 스트림 분리에서 Half-close [TCP/IP][C][LINUX]

https://pupuduck.tistory.com/85에서 다뤘듯 fdopen 함수로 파일 디스크립터를 FILE형 포인터로 변환시킬 수 있습니다. 그리고 https://pupuduck.tistory.com/70에서 입출력 스트림 분리와 분리했을 때의 장점을..

pupuduck.tistory.com


멀티플렉싱 - epoll

epoll_create() / epoll_ctl() / epoll_wait()

 

17-1. epoll 방식을 통한 IO 멀티플렉싱 [TCP/IP][C][LINUX]

https://pupuduck.tistory.com/78에서 select 함수를 통한 IO 멀티플렉싱을 다뤘습니다. select 함수는 대부분의 운영체제에서 작동한다는 큰 강점이 있습니다. 다만 select 함수는 두 가지 큰 문제점이 있는데,

pupuduck.tistory.com


레벨트리거와 엣지트리거

 

17-2. 레벨 트리거와 엣지 트리거 [TCP/IP][C][LINUX]

레벨 트리거 방식은 입력버퍼에 데이터가 남아있는 동안 계속 이벤트가 등록됩니다. 엣지 트리거 방식은 입력버퍼로 데이터가 수신된 상황에서 딱 한 번만 이벤트가 등록됩니다. https://pupuduck.ti

pupuduck.tistory.com


쓰레드란?

 

18-1. 쓰레드란 무엇일까?

https://pupuduck.tistory.com/63에서는 멀티프로세스 기반의 서버구현에 대해 다뤘는데, 프로세스의 생성은 select나 epoll에 비해 확실히 구분되는 장점이 있지만 큰 단점들이 있었습니다. 프로세스 생성

pupuduck.tistory.com

쓰레드 생성 및 실행방법

pthread_create()

pthread_join() / pthread_detach()

 

18-2. 쓰레드의 생성과 실행방법 [C][LINUX]

쓰레드는 별도의 실행흐름을 가지기에 쓰레드만의 main 함수가 필요합니다. 그리고 이 함수를 시작으로 별도의 실행흐름을 형성해 줄 것을 운영체제에게 요청해야 합니다. #include int pthread_create(

pupuduck.tistory.com

임계영역

 

18-3. 쓰레드의 임계영역, 동기화 [C][LINUX]

둘 이상의 쓰레드를 생성할 때, 둘 이상의 쓰레드가 동시에 호출하면 문제를 일으키는 문장의 영역을 임계영역이라 합니다. 따라서 함수는 임계영역과 관련해서 두 종류로 나뉘어집니다. 쓰레

pupuduck.tistory.com

뮤텍스

pthread_mutex_init() / pthread_mutex_destroy()

pthread_mutex_lock() / pthread_mutex_unlock()

 

18-4 쓰레드 동기화 - 뮤텍스 [C][LINUX]

뮤텍스란 Nutual Exclusion의 줄임말로, 쓰레드의 동시접근을 허용하지 않는다는 의미가 있습니다. 특정 영역을 접근할 때 자물쇠를 채우고, 나갈 때 자물쇠를 푸는 방식으로 활용됩니다. #include int p

pupuduck.tistory.com

세마포어

sem_init() / sem_destory()

sem_post() / sem_wait()

 

18-5 쓰레드 동기화 - 세마포어(Semaphore) [C][LINUX]

세마포어는 18-4에서 다룬 뮤텍스와 유사합니다. 여기서는 0과 1만을 사용하는 바이너리 세마포어라는 것을 대상으로 쓰레드의 실행순서 컨트롤 중심의 동기화를 다룹니다. #include int sem_init(sem_t

pupuduck.tistory.com

 


 

반응형