소켓프로그래밍

제가 지금까지 작성해온 글들을 한 페이지에 정리해둔 것입니다. 개념을 정리한게 아닌 함수가 무엇이 있었는지 쉽게 찾기위한 정리입니다. 함수의 이름만 써져있으며, ()은 인자가 없다는게 아닌 함수라는 것을 뜻합니다. 전체 내용은 LINUX를 기반합니다. 프로토콜 체계와 소켓의 타입 소켓의 프로토콜 체계와 타입을 설정해서 TCP소켓 또는 UDP소켓으로 만들 수 있었다. 2. 소켓의 프로토콜과 타입 [TCP/IP][C][LINUX] 프로토콜이란 컴퓨터 상호간 대화에 필요한 통신규약입니다. #include int socket(int domain, int type, int protocol); // success: 파일 디스크럽터 fail: -1 sys/socket.h에서 소켓 함수는 위와 같이 구성되.. pupu..
https://pupuduck.tistory.com/63에서는 멀티프로세스 기반의 서버구현에 대해 다뤘는데, 프로세스의 생성은 select나 epoll에 비해 확실히 구분되는 장점이 있지만 큰 단점들이 있었습니다. 프로세스 생성 자체가 부담스럽다. 두 프로세스 사이에서 데이터 교환을 위해선 별도의 IPC 기법을 거쳐야 한다 컨텍스트 스위칭이 초당 수십번에서 수천번까지 일어난다. 여기서 컨텍스트 스위칭이란 A프로세스와 B프로세스가 있고 메인 메모리에 A프로세스가 있을 때, B프로세스를 실행하기 위해 A프로세스 관련 데이터를 메인 메모리에서 하드디스크로 이동시키고 B프로세스를 메인 메모리에 이동시키는 것입니다. 이 과정이 초당 수십번에서 수천번 일어나는 것은 큰 부담이 아닐 수 없습니다. 이 여러 단점을 최..
https://pupuduck.tistory.com/78에서 select 함수를 통한 IO 멀티플렉싱을 다뤘습니다. select 함수는 대부분의 운영체제에서 작동한다는 큰 강점이 있습니다. 다만 select 함수는 두 가지 큰 문제점이 있는데, 첫 번째로 모든 파일 디스크립터를 대상으로 반복문을 돌려야 한다는 것이고, select 함수를 호출할 때마다 인자로 관찰대상에 대한 정보들을 매번 전달해야 합니다. 프로그램으로서, 운영체제에게 데이터를 매번 전달하는 것은 많은 부담이 따릅니다. 따라서 운영체제에게 관찰대상에 대한 정보를 한 번만 알려주고 관찰대상의 범위나 내용에 변경이 있을 때 변경 사항만 알려줄 필요가 있습니다. 이는 운영체제가 지원을 해줘야 작동이 가능한데, 이 지원하는 방식을 리눅스에서는 e..
서버가 한 번에 한 요청만 받을 수 있다면 연결요청이 무수히 쌓였을 때 후순위에 있는 요청은 받아들여지기까지 긴 시간이 걸릴 것입니다. 또, 네트워크 프로그램은 데이터의 송수신 시간이 큰 비중을 차지하기에 한 번에 한 요청보단 여러 요청을 받는 것이 더 유리합니다. 그래서 둘 이상의 클라이언트에게 동시에 서비스를 제공하는 다중접속 서버가 필요합니다. 멀티프로세스 기반 서버 : 다수의 프로세스를 생성하는 방식 멀티플렉싱 기반 서버 : 입출력 대상을 묶어서 관리하는 방식 멀티쓰레딩 기반 서버 : 클라이언트의 수만큼 쓰레드를 생성하는 방식 위는 대표적인 세 가지 다중접속 서버입니다. 이 문서에서는 제목에서 말했듯 멀티프로세스 기반 서버에 대해서 다룰 것입니다. 먼저 프로세스란, 메모리 공간을 차지한 상태에서 ..
Nagle 알고리즘은 네트워크 상에서 돌아다니는 패킷들의 오버플로우를 막기 위해 1984년 제안된 알고리즘으로, 앞서 전송한 데이터에 대한 ACK 메시지를 받아야만 다음 데이터를 전송하는 알고리즘입니다. TCP상에서 적용되는 간단한 알고리즘이고, 적용여부에 따른 데이터 송수신 방식의 차이는 다음과 같습니다. 문자열 "Nagle"을 전송할 때 알고리즘을 적용했을 때와 적용하지 않았을 때의 극단적인 상황을 보여주는 예시입니다. 왼쪽 그림에서, 데이터 'N'을 보내고, ACK가 올 때까지 출력버퍼에 a, g, l, e를 쌓다가 ACK가 도착하자 데이터 'agle'를 하나의 패킷으로 보내는 모습입니다. 1바이트의 데이터를 보내더라도 패킷의 헤더정보의 크기가 수십바이트기 때문에 위 예시에선 알고리즘을 적용했을 때..
이 소켓의 옵션을 소개하기 이전에, Time-wait 상태를 얘기하겠습니다. 우리가 서버를 키고 종료할 때 컨트롤-C 등으로 강제 종료하고 즉시 다시 키려고 시도하면 bind()함수에서 에러가 발생하는 모습을 이미 보셨을 수도 있습니다. 이 상황이 발생한 이유는 Time-wait 상태 때문인데, 데이터 송수신 중에 먼저 연결의 종료를 요청한 호스트는 Time-wait 상태를 거치게 됩니다. 만약 클라이언트와 통신 중에 위의 예시와 같이 강제종료 하는 등 서버가 먼저 종료되면, 서버가 Time-wait 상태를 거치게 되는 것입니다. 이 상태는 소켓이 소멸되지 않고 남아있게 됩니다. (TCP에서 송수신이 종료되는 과정을 모르신다면 https://pupuduck.tistory.com/35를 참고해주시기 바랍니..
소켓이 생성되면 기본적으로 입력버퍼와 출력버퍼가 생성됩니다. SO_RCVBUF는 입력버퍼의 크기와 관련된 옵션이고 SO_SNDBUF는 출력버퍼의 크기와 관련된 옵션입니다. 이 두 옵션을 이용해 입출력 버퍼의 크기를 참조할 수 있고, 변경 또한 할 수 있습니다. 다음 소스코드는 입출력버퍼의 크기를 얻는 예제입니다. #include #include #include #include void error_handling(char *message); int main(int argc, char *argv){ int sock; int snd_buf, rcv_buf, state; socklen_t len; sock=socket(PF_INET, SOCK_STREAM, 0); // 출력버퍼의 크기를 얻는다. len=size..
프로토콜 레벨 SOL_SOCKET에 있는 SO_TYPE 옵션은 소켓의 타입정보를 확인하는 옵션입니다. #include #include #include #include void error_handling(char *message); int main(int argc, char *argv){ int tcp_sock, udp_sock; int sock_type; socklen_t optlen; int state; optlen=sizeof(sock_type); // tcp/udp 소켓 생성 tcp_sock=socket(PF_INET, SOCK_STREAM, 0); udp_sock=socket(PF_INET, SOCK_DGRAM, 0); //tcp/udp 소켓 생성 시 2번째 인자로 들어간 상수 값 출력 print..
푸더기
'소켓프로그래밍' 태그의 글 목록