일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Algorithm
- 프로그래머스 레벨 2
- 레벨 1
- 자바스크립트
- TCP
- Crawling
- Nestjs
- dp
- ip
- typescript
- socket
- 수학
- Node.js
- 프로그래머스
- 그래프
- 문자열
- 크롤링
- 쉬운 문제
- 알고리즘
- 타입스크립트
- dfs
- 소켓
- HTTP 완벽 가이드
- BFS
- javascript
- 백준
- 타입 챌린지
- HTTP
- type challenge
- 가천대
- Today
- Total
목록소켓 (11)
kakasoo
server와 client는 서로 이렇게 입출력을 주고 받는다, 물론 main이 되는 server가 있긴 하겠지만, 이런 입출력은 반드시 server와 client간의 것이 아니니, client끼리도 입출력을 주고받을 수는 있긴 하겠다, 그러니 그림을 다시 그려보자. 좌측처럼 그리면 모든 대상이 정보를 주고 받을 수 있을 것이다. 하지만 필요한 socket의 수가 매우 많아질 것이고, 당연히 연결도 빈번해지니 전체 시스템이 느려질 수 밖에 없다. 그러니까 새로이, 우측 같은 그림으로 다시 그려보자. 이런 형태로 그리게 된다면, 각 선의 길이도 (개수를 의미) 줄고 입출력의 숫자도 절반으로 줄어들게 된다. 멀리플렉싱 기반의 서버라는 것은 위의 그림과 같은 형태를 의미하는데, 엄밀히 표현하면, 서버에 멀티플..
음, 해보다 안 것인데, server 하나에 client 여러 개를 연결할 수가 없다. 이게 아마, 프로세스와 스레드가 필요한 영역. 문제가 된 요소를 몇 개 발견했는데, client 2개가 있다고 하자, 하나는 A, 하나는 B라고 명명할 때 A를 서버에 연결했다. 이 상태로 연결이 잘 되고 있다고 할 때, B도 서버에 연결해보았다, 그런데 B는 전혀 동작하지 않는다. 이 서버는 동시성이 없기 때문이다. 그런데 B에서 메세지를 보낸다, 당연히 처리되지 않는다. A에서 서버와 연결을 종료한다, 그럼 B에서 동작해야 할 거 같지만, 앞서 B가 보낸 메세지는 씹혔다, 서버는 계속 B의 메세지를 기다리고 있는데 B는 이미 다음 단계로 넘어가서 메세지를 보낼 수가 없다. 동시성만이 이 문제를 해결할 수 있는 듯 ..
클라이언트에서 입력한 것을, 서버가 받아서, 동일한 값을 되돌려 주는 에코 서버, 클라이언트이다. 자세한 내용은 모두 주석으로 처리하였으니, 읽고 기억을 되새겨보도록 하자. 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..
오늘은, 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..
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를 말해야 한다.) 포트 번호는 무엇인가 -..
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 #include #include #include void ErrorHandling(const char* message) { fputs(message, stderr); // buffer 문제를 없애기 위해서 stderr를 전달 => 기본출력장치(모니터), 에러 fputc('\n', stderr); } // argc == 옵션의 개수 // argv == 옵션의 값, 명칭 int main(int argc, char* argv[]) { WSA..
윈속(윈도우 소켓)을 기반으로 하는 프로그램을 개발하기 위해서는 다음 2가지를 선행해야 한다. 1. header file로 winsock2.h 를 포함시킨다. 2. ws2_32.lib 라이브러리를 링크시켜야 한다. 해당 내용은 설정에서, 추가 종속성의 우편에 적어주면 된다. (ws2_32.lib) 이를 통해 헤더 파일로 추가하면 윈속과 관련된 함수들을 마음대로 호출할 수 있게 된다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include #include using namespace std; void ErrorHandling(const char* message) { fputs(message, stderr); // buffer 문제를 없애기 위해서 stderr를 전달 => 기본..
네트워크 프로그래밍은 운영체제와 시스템 프로그래밍에 대한 약간의 지식이 필요하다. 또한 네트워크 상의 전송규약인 TCP/IP 라는 프로토콜을 어느 정도 이해해야 한다. 네트워크와 소켓에 대한 이해 네트워트 프로그래밍은 서로 다른 두 컴퓨터가 정보를 교환할 수 있도록 하는 것을 의미한다. 이 과정에서는 물리적인 연결이 필요하고, 이 안에서 작동할 소프트웨어가 필요한데, 이 연결은 이미 다 되어 있다. 지금 존재하는 대부분의 컴퓨터들은 이미 인터넷이라고 하는 '물리적인 연결'이 되어 있는 상태기 때문에, 우리가 고민해야 할 부분은 이제 이 망에서 작동할 소프트웨어적 데이터의 송수신 방법이다. 하지만 이 방법 역시 운영체제에 상에서 소켓'Socket' 이라는 것을 제공하기 때문에 이미 해결되어 있는 상태다. ..