일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- HTTP
- 그래프
- 문자열
- typescript
- 쉬운 문제
- 크롤링
- dp
- 수학
- 알고리즘
- 타입스크립트
- 프로그래머스
- dfs
- TCP
- 가천대
- 자바스크립트
- 타입 챌린지
- 소켓
- 백준
- javascript
- Nestjs
- Crawling
- BFS
- type challenge
- 레벨 1
- socket
- HTTP 완벽 가이드
- ip
- Algorithm
- Node.js
- 프로그래머스 레벨 2
- Today
- Total
목록프로그래밍 (478)
kakasoo
내 지인 sdworkbase가 나한테 운영체제에 대한 과외를 해줬을 때, 프로세스에 관한 이야기가 나온 적 있었다. 프로세스는 메모리 공간을 차지한 상태에서 실행 중인 프로그램을 지칭하는 말이다. 저장 중인 상태에서는 프로그램이지만, 동작하는 시점에서는 프로세스다. 이런 원리가 갑자기 왜 나오냐면, 내가 만들 서버에서도, 다중 접속을 허용하기 위해 필요하기 때문이다. 프로세스들은 운영체제에 의해서 실행과 멈춤을 반복하게 되는데, 마치 껌벅이는 듯한 이런 모양새 덕분에 컴퓨터는 적은 자원으로 여러 프로그램들을 실행시킬 수 있게 된다. 말하자면, 하나의 서버는 1등부터 100등까지 선착순으로 정보를 제공해주는데, 1등과 100등의 접속 시간 차이가 단 0.5초에 불과한데도 결과에 대한 지연 시간이 너무 큰 ..
IP 주소와 도메인 이름 사이에서 변환을 수행하는 시스템을 가리켜 DNS (Domain Name System) 이라고 하며, DNS의 중심에는 DNS 서버가 있다 - 윤성우 열혈 TCP/IP 소켓 프로그래밍 184P 125.209.222.141를 주소창에 입력해보자, 두려워하지 말라, 이상한 게 아니다. 넣으면 네이버가 나온다, 이는 네이버의 IP 주소이다. 자, 다시 정리해보자, 네이버 "도메인" 주소는 www.naver.com 이다. 네이버 네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요 www.naver.com 왜 이 주소가 아닌 숫자를 입력해도 네이버가 나오는 걸까, 이 두 접속 방법의 차이는 무엇일까? 정답은, 문자열로 되어 있는 이 주소는 가상의 주소이지, 실제 주소가 아니라는 점이..
음, 해보다 안 것인데, server 하나에 client 여러 개를 연결할 수가 없다. 이게 아마, 프로세스와 스레드가 필요한 영역. 문제가 된 요소를 몇 개 발견했는데, client 2개가 있다고 하자, 하나는 A, 하나는 B라고 명명할 때 A를 서버에 연결했다. 이 상태로 연결이 잘 되고 있다고 할 때, B도 서버에 연결해보았다, 그런데 B는 전혀 동작하지 않는다. 이 서버는 동시성이 없기 때문이다. 그런데 B에서 메세지를 보낸다, 당연히 처리되지 않는다. A에서 서버와 연결을 종료한다, 그럼 B에서 동작해야 할 거 같지만, 앞서 B가 보낸 메세지는 씹혔다, 서버는 계속 B의 메세지를 기다리고 있는데 B는 이미 다음 단계로 넘어가서 메세지를 보낼 수가 없다. 동시성만이 이 문제를 해결할 수 있는 듯 ..
문제는 클라이언트가 전송을 할 때, BUF_SIZE 값보다 큰 경우다. 전송을 하게 될 때, 다 전송 받은 상태인지, 사이즈가 커서 잘렸는지 알 수가 없지 않은가, 그렇지만 괜찮다. echo_server와 client는 이미 "자신이 보낸 정보의 크기"를 알고 있는 경우에 해당하기 때문이다. echo_client는 정보를 보내고, 자신이 돌려 받을 때에도 똑같은 크기가 돌아왔는지 확인하고, 그렇지 않다면 대기하면 된다. echo를 괜히 만든 게 아니다, 우리가 만들려는 게 그저 서버와 클라이언트가 했던 말 따라 하는 프로그램을 작성하려던 게 아니고, 정보의 송수신이 문제 없이 이루어졌는지를, 매 순간 확인하기 위한 것이기 때문이다. 쓸 데 없이, 왜 했던 말 반복하는 서버-클라이언트를 만들었냐고 생각하지..
클라이언트에서 입력한 것을, 서버가 받아서, 동일한 값을 되돌려 주는 에코 서버, 클라이언트이다. 자세한 내용은 모두 주석으로 처리하였으니, 읽고 기억을 되새겨보도록 하자. echo_server.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 #include #include #include #include #define BUF_SIZE 1024 void ErrorHandling(char* mes..
iteractive 라는 말 때문에 복잡해보일 수 있는데, 사실 이건 "반복적인" 이라는 뜻에 불과하다. 반복적이라니, 도대체 무엇이 반복적이란 말인가? 사실 매우 간단하다. 지금 우리가 소켓 프로그래밍을 해본 걸 보면, 서버와 연결되는 즉시 값을 반환하고 양측의 소켓이 종료된다. 이런 식으로 만들면 안 된다, 소켓이 몇 개인지 알고, 또 정보 요구가 몇 번이나 올 줄 알고 1회성 서버를 만드는가. 그래서, 반복문으로, accept() 함수를 여러 번 반복시킨다, 또는 무한히 반복시킨다. 어디서부터 어디까지가 반복인지 설명하기 위해서 아래의 도식을 봐주길 바란다. 1. socket() 2. bind() 3. listen() 4. accept() 5. read() / write() // 데이터를 송수신한다..
오늘은, TCP 기반의 서버를 만들어보고자 한다, 당연히 서버만 있으면 동작 여부를 모르니 클라이언트도 만든다. 복습 겸, 지금까지 소켓의 생성부터 데이터 송수신에 관한 것을 정리해보도록 하자. server측 0. WSAStartup() // 함수 요청 1. socket() // 소켓을 생성한다. 2. bind() // 소켓에 정보를 바인드한다, 즉 주소 정보를 할당한다. 3. listen() // 소켓을, 연결 요청 대기 상태로 한다. 4. accept() // 정보가 들어왔을 경우에 연결을 허용한다. 5. read() / write() // 데이터를 송수신한다. 이는 리눅스일 경우의 함수이고, 윈도우일 때에는 send()와 connect()였다. 6. close() // Socket을 close() ..
오늘은 여기까지... LINK 계층부터 차례대로 올라가면서 이야기를 해보도록 하자. LINK 계층은, 물리적인 영역의 표준화에 대한 결과라고 한다, 이는 가장 기본이 되는 LAN,WAN,MAN 을 의미한다. 우리가 랜선 랜선 하는 그 랜, 즉 물리적인, 소프트웨어가 아닌, 하드웨어적인 연결을 의미한다. (꼭 하드웨어라고 할 수는 없겠다, 노트북은 무선으로도 망에 연결되어 사용되긴 하니까, 어쨌든 망을 의미한다.) 망이 연결되었다면, 이제 우리는 IP 계층에 접근할 수 있다. IP 계층에서 우리는 이제 데이터를 송신할 수 있게 된다, 그런데 우리가 앞서 서버와 클라이언트 소켓을 만들며 경험했던 것과 같이, 해야 할 작업들이 있다. IP에서 세부적인 프로토콜을 정해줄 필요가 있다, 이 과정에서 우리는 IPv..
인터넷 프로토콜(IPv4) 기반 소켓인 경우, 데이터 전송방법에 따라 TCP socket과 UDP socket으로 나뉘고, 특히 TCP 소켓의 경우 연결을 지향하기 때문에 stream 기반 소켓이라고 이야기한다. TCP는 앞전에 말했듯이 Transmission Control Protocol의 약자로, 전송 제어 프로토콜, 데이터 전송 과정의 컨트롤이라는 뜻을 가지고 있다. 좌측의 그림을 볼 때, TCP/IP 스택이 총 4개의 계층으로 나뉘어 있음을 볼 수 있다. 이는 데이터 송수신의 과정이 총 4개의 영역에서 이루어지는 것으로 받아들일 수 있는데, 이는 즉 '인터넷 기반의 효율적인 데이터 전송'이라는 커다란 하나의 문제를 하나의 덩치 큰 프로토콜 설계로 해결한 것이 아니라, 그 문제를 작게 나눠서 계층화..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #define _WINSOCK_DEPRECATED_NO_WARNINGS // inet_addr 함수 사용을 위함, ntoa에도 필요하다. #define _CRT_SECURE_NO_WARNINGS // strcpy #include #include #include void ErrorHandling(char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } int main(int argc, char* argv[]) { WSADATA ..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include #include void ErrorHandling(char* message); int main(int argc, char argv[]) { WSADATA wsaData; unsigned short host_port = 0x1234; unsigned short net_port = htons(host_port); // h to n (short), 호스트에서 네트워크로, short 형. unsigned long host_addr = 0x12345678; unsigned long net_addr = htonl(host_addr); // h to n (long), 호스트에서 네트워..
주소정보의 표현 1 2 3 4 5 6 7 8 9 10 struct in_addr{ in_addr_t s_addr; // 32bit IPv4 인터넷 }; struct sockaddr_in{ sa_family_t sin_family; // 주소체계(address Family) uint16_t sin_port; // 16비트 TCP/UDP PORT 번호 struct in_addr sin_addr; // 32bit IP 주소 char sin_zero[8] // 사용되지 않음 }; Colored by Color Scripter cs 어떤 주소 체계를 사용하는가 -> IPv4 IP 주소는 무엇인가 -> xxx.xxx.xxx.xxx (자신의 IP, 또는 연결하고자 하는 IP를 말해야 한다.) 포트 번호는 무엇인가 -..