위 그림은 Iterative 서버의 함수호출 순서, TCP 서버-클라이언트 구현을 나타낸 것입니다. Iterative 서버란 반복문을 삽입해 accept 함수를 반복 호출해서 연결요청을 하는 모든 클라이언트에게 서비스를 제공하는 개념입니다. 클라이언트가 connect()로 연결요청을 하면 서버의 listen()에서 할당된 연결요청 큐에 추가됩니다. 서버는 들어온 연결요청을 하나하나 accept() 하고 서비스를 제공하고 close()로써 마무리하는 과정을 반복합니다. 이러면 한 번에 한 클라이언트에게만 서비스를 제공할 수 있게 되는데, 이는 프로세스와 쓰레드를 통해 다중 클라이언트에게 서비스를 제공하는 서버를 만들 수 있게 됩니다. echo란 입력한 문자열을 그대로 출력해주는 것(명령어 등)을 뜻합니다...
전체 글
푸더기의 다사다난한 블로그입니다TCP/IP 프로토콜 스택은 위와 같이 네 개의 계층으로 나뉩니다. TCP 소켓을 이용할 땐 TCP 계층을 포함한 네 계층, UDP 소켓을 이용할 땐 UDP 계층을 포함한 네 계층을 통해 데이터를 송수신하게 됩니다. LINK 계층은 물리적인 영역의 표준화에 대한 결과로, LAN, WAN, MAN 등 네트워크 표준과 관련된 프로토콜을 정의하는 영역이며 가장 기본이 되는 영역입니다. 두 호스트가 데이터를 주고 받을 때 필요한 물리적인 연결부가 LINK 계층입니다. IP 계층은 목적지로 데이터를 전송하기 위해 어떤 경로를 거쳐갈 지를 해결하는 계층입니다. IP 계층에서 사용하는 IP 프로토콜은 데이터를 전송할 때마다 거쳐야 할 경로를 선택해주는데, 이 과정에서 데이터가 손실되는 등 오류가 발생할 시 이를 해결..
https://www.acmicpc.net/problem/12100 12100번: 2048 (Easy) 첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2 www.acmicpc.net 당직 서다 심심해서 2048 만들고 아 이런 문제 있었는데 해서 풀어본 문제입니다 히히; n이 20밖에 안돼서 완전탐색으로 충분히 풀 수 있는 문제였습니다. 보드의 값들을 이동시킬 때(갱신시킬 때), 각 행/열을 먼저 deque에 push_back으로 다 넣어주고 이동방향(위로 갈 경우 위에서부터) front에서부터 하나씩 꺼내주며 갱신해줬습니다. 값이 합쳐지는 경우는..
OS에 따라 자료형의 바이트 수가 바뀔 수 있습니다. 예를 들어 16비트 OS에서는 int는 2바이트임에 반해 32비트 OS에서는 4바이트를 가지고 있는 경우가 있습니다. (물론 같은 경우도 있고, 컴파일러에 따라 다르지만 OS의 비트와 int형의 비트수를 맞추는 경향이 있다고 합니다.) 그래서 다음은 이를 고려해서 4바이트 자료형이 항상 4바이트임을 보장받을 수 있도록 POSIX에서 정의한 자료형 입니다. 자료형 이름 자료형 정보 선언된 헤더파일 int8_t signed 8-bit int sys/types.h uint8_t unsigned 8-bit int (unsigned char) int16_t signed 16-bit int uint16_t unsigned 16-bit int (unsigned s..
앞서 우리는 클라이언트와 서버를 간략하게 짜보면서 sockaddr_in이라는 구조체를 사용했습니다. 이는 주소정보를 담기 위한 구조체입니다. 이 구조체는 다음과 같이 정의되어 있습니다. struct sockaddr_in{ sa_family_t sin_family; //주소 체계 uint16_t sin_port; //16비트 TCP/UDP PORT번호 struct in_addr sin_addr; //32비트 IP주소 char sin_zero[8]; //사용되지 않음(단, 0으로 채워줘야 함) } //위에서 사용된 struct in_addr은 다음과 같습니다. struct in_addr{ in_addr_t s_addr; //32비트 IPv4 인터넷 주소 } sin_family는 주소체계를 담습니다. 프로토콜..
IP주소 체계는 IPv4와 IPv6으로 나뉩니다. 각각 4바이트 주소체계, 16바이트 주소체계를 뜻하는데 오늘날엔 아직 IPv4를 대중적으로 사용하고 있습니다. (그래서 앞으로도 IPv4를 기준으로 말합니다) IPv4는 주소는 네트워크 주소와 호스트 주소로 나뉘어 있으며 형태에 따라서 A,B,C,D,E 클래스로 분류되는데, 여기서 E클래스는 일반적이지 않은(예약 되어있는) 클래스입니다. A,B,C,D 클래스의 구분은 다음과 같습니다. 클래스 A 1BYTE (네트워크 ID) 1BYTE*3(호스트 ID) 클래스 B 1BYTE*2 (네트워크 ID) 1BYTE*2(호스트 ID) 클래스 C 1BYTE*3 (네트워크 ID) 1BYTE(호스트 ID) 클래스 D 1BYTE*4 (멀티캐스트 IP주소) 첫 번째 바이트 범..
프로토콜이란 컴퓨터 상호간 대화에 필요한 통신규약입니다. #include int socket(int domain, int type, int protocol); // success: 파일 디스크럽터 fail: -1 sys/socket.h에서 소켓 함수는 위와 같이 구성되어 있는데, 여기서 첫 번째 인자로 들어가는 domain이 프로토콜 체계를 뜻합니다. 이 헤더파일에 선언되어 있는 프로토콜 체계의 종류는 다음과 같습니다. PF_INET IPv4 인터넷 프로토콜 체계 PF_INET6 IPv6 인터넷 프로토콜 체계 PF_LOCAL 로컬 통신을 위한 UNIX 프로토콜 체계 PF_PACKET Low Level 소켓을 위한 프로토콜 체계 PF_IPX IPX 노벨 프로토콜 체계 프로토콜 체계가 결정되었다고 데이터의 ..
소켓이란, 데이터 송수신에 사용할 수 있는 소프트웨어 장치이며 네트워크 망의 연결에 사용되는 도구입니다. 또, 네트워크를 통한 두 컴퓨터의 연결을 의미하기도 합니다. 다음은 서버 프로그램 구현에 쓰이는 함수들입니다. #include int socket(int domain, int type, int protocol); // success: 파일 디스크럽터 fail: -1 #include int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); // success: 0 fail: -1 #include int listen(int sockfd, int backlog); // success: 0 fail: -1 #include int accept(int..