목록분류 전체보기 (23)
layered
5-1 에코 클라이언트의 완벽 구현! TCP는 전송되는 데이터의 경계가 없다. 스트림을 구성해서 전달하기 때문이다. 따라서 한 번의 send로 데이터를 보낼 때 내부적으로는 여러 개의 패킷으로 쪼개서 전달할 수도 있고, 이는 recv를 통해서 받을 때에도 마찬가지이다. 예를 들면 [안녕하세요!]를 보냈는데 실제로는 [안] [녕하] [세요!]로 쪼개서 보낼 수도 있다는 것이다. 이런 특성으로 인해 아직 수신 버퍼에 원하는 만큼의 데이터가 쌓이지 않았는데 그대로 읽어 버릴 수도 있기 때문에, 반복문을 돌려서 보낸 데이터의 길만큼 받도록 해야 한다. 다음과 같이 코드를 수정할 수 있다. int send_len = send(serv_sock, message, strlen(message), 0); // 보낸 데이..
Server.c #define _WINSOCK_DEPRECATED_NO_WARNINGS #include #include #include ; #include #include #define BUF_SIZE 1024 #pragma comment(lib, "Ws2_32.lib") void error_handling(const char*); int main() { WSADATA wsadata; if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) error_handling("WSAStartup() error!"); SOCKET serv_sock, clnt_sock; struct sockaddr_in serv_addr, clnt_addr; char message[BUF_SIZE + 1..
4-2 TCP 기반 서버, 클라이언트 구현 TCP 서버의 기본적인 함수 호출 순서 리눅스에서는 send/recv 대신 read/write를 사용하기도 한다. 윈도우에서는 send/recv만 사용할 수 있다. 윈도우에서 소켓은 closesocket()으로 닫는다. 메모 리눅스에서만 read/write는 파일을 다룰 때에도 사용하지만 send/recv는 소켓에서만 사용할 수 있다(대신 여러 옵션을 부여할 수 있다는 장점이 있다). 리눅스에서만 작동시키려면 read/write를 쓰고, 윈도우와의 호환성을 고려한다면 send/recv를 쓰는 것이 좋은 것 같다. 연결요청 대기상태로의 진입 소켓에 주소를 할당했다면, 이제 연결을 해도 된다고 알려야 한다. 즉, 소켓을 LISTENING 상태로 만드는 것이다. in..
3-1 소켓에 할당되는 IP 주소와 PORT 번호 인터넷 주소 Internet Protocol은 인터넷 상에서 데이터를 송수신할 목적으로 컴퓨터에게 부여하는 값이다. 즉, 네트워크 상에서 컴퓨터를 잘 찾아가기 위한 주소라고 할 수 있다. IP 주소는 IPv4와 IPv6로 나뉘는데 둘의 차이점은 사용하는 바이트 수이다. 원래 사용하는 것은 IPv4인데, 인터넷이 워낙 규모가 커지다 보니 4바이트로는 한계가 있어 16바이트의 IPv6가 점점 도입되는 추세이다. IPv4 기준으로 IP 주소는 네트워크 주소와 호스트 주소로 나뉜다. 그래서 데이터는 네트워크(= 라우터)에 먼저 전송되고, 이 라우터에서 호스트로 전송하는 것이다. 메모 아주 간단하게 말하면 네트워크는 호스트와 라우터들의 집합이다. 호스트는 서버나 ..
프로토콜 Protocol 컴퓨터 상호간의 대화에 필요한 통신규약. 이렇게 말하면 조금 모호한 면이 있을 것이다. 간단하게 다음과 같은 상황이 있다고 생각해 보자. 컴퓨터들이 서로 통신을 하려고 한다. 몇 가지 물음표가 떠오를 것이다. What is communicated How it is communicated When it is communicated 이런 것들을 상호간에 정하는 게 바로 프로토콜이다! 이제 소켓을 생성하는 함수를 다시 살펴보자. int socket(int domain, int type, int protocol); SOCKET socket(int af, int type, int procotol); domain, af 소켓이 사용할 프로토콜 체계(Protocol Family) 정보를 전달..
과제하면서 공부하는 거라 틀린 내용 있을 수 있음.. 소켓 Socket 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있게 하려면 어떻게 해야 할까? 일단 두 컴퓨터를 어떤 식으로든 연결해 줘야 하는데 이는 인터넷이라는 거대한 네트워크가 있으므로 해결이 된다. 그리고 이를 기반으로 데이터를 송수신하는 소프트웨어적인 방법을 고민해야 하는데, 이것도 운영체제에서 소켓이라는 것을 제공하므로 쉽게 풀린다. 그냥 네트워크 상에서 데이터를 주고받기 위해 필요한 것이 소켓이다! 정도로 이해하면 될 것 같다. 참고) 소켓이라는 표현은 전기를 공급받기 위해 소켓을 꽂는 것처럼, 데이터의 송수신을 위해 인터넷이라는 네트워크 망에 연결한다는 의미이다. 또는 네트워크를 통한 두 컴퓨터의 연결 자체를 뜻하기도 한다. 전화 받는 ..
https://www.acmicpc.net/problem/27893 27893번: 특별한 드롭킥 NLCS Jeju의 구조는 생각보다 부실해서, 벽이나 문 등을 드롭킥으로 부술 수 있다. NLCS Jeju의 복도는 1차원 수직선으로 모델링할 수 있으며, 동호의 현재 좌표는 $x=0$이다. 동호는 $x=N$에 있는 교실로 www.acmicpc.net 조금 까다로웠던 문제. 맞왜틀 어떻게 풀어야 할지는 생각했는데, 그게 코드를 구현하는 관점에서는 조잡한 풀이여서 오래 걸린 것 같다. 다 풀고 나서 다른 코드들을 보니 확실히 그런 생각이 들었다. 그럼 시작! 동호가 장애물을 놓는 경우는 크게 두 가지로 나눌 수 있다. 1. 장애물 옆에 놓는다 ..XX.. 2. 장애물만 덩그러니 놓는다. ..X...X 조금 더 ..
https://www.acmicpc.net/problem/13334 13334번: 철로 입력은 표준입력을 사용한다. 첫 번째 줄에 사람 수를 나타내는 양의 정수 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 각 줄에 정수 쌍 (hi, oi)가 주어진다. 여기서 hi와 oi는 −100,000,000이상, 100,000,0 www.acmicpc.net 기본적인 흐름은 철로를 움직이면서 해당되는 경로(집-사무실)의 개수를 세는 것이다. 이때 관건이 되는 부분은 두 가지라고 생각했다. 1 철로를 어떻게 움직일 것인가? 한 칸씩 움직일 필요는 없다. 부담스럽기도 하고, 어떤 구간은 경로가 위치하지 않을 수도 있어 낭비되는 구간이 생긴다. 최대한 철로의 시작이나 끝부터 경로가 바로 포함되도록 하는 게..
https://www.acmicpc.net/problem/13460 13460번: 구슬 탈출 2 첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B' www.acmicpc.net 그냥 시뮬레이션 해서 구현하는 문제. 공이 네 방향으로 굴러갈 수 있으므로 bfs 기반이지만 공이 굴러가다가 알아서 방향을 트는 건 불가능하니까 약간의 처리를 해 주어야 한다. 처음 구상은 이랬다. 1 먼저 공이 굴러갈 방향을 찾는다(벽만 없다면 굴러갈 수 있다) 2 공을 가상으로 굴린다 공은 한 번 굴리면 그 방향으로만 쭉 가야 하니까, 차라리 ..
개념 버튼을 클릭하거나 화면을 터치하게 되면 이벤트라는 것이 만들어지는데, 이는 화면의 어느 부분에 어떻게 동작이 일어났는지에 대한 정보를 담게 된다. 이 이벤트를 가로채는 방법은 크게 두 가지가 있다. 제대로 이해한 게 맞는지 모르겠다... 1 콜백 메서드 재정의 View 클래스는 onTouchEvent()처럼 안드로이드 프레임워크에 의해 호출되는 콜백 메서드를 기본적으로 가지고 있다. 그리고 이를 이용해 이벤트를 가로채려면 클래스를 상속해서 메서드를 재정의해 줘야 한다. 하지만 이벤트 하나 처리하자고 매번 상속하고 재정의하는 것이 번거롭기 때문에, 안드로이드에서는 2와 같은 이벤트 리스너 기능을 지원한다. 뷰 클래스를 어쩔 수 없이 상속해야 하는 경우엔 이벤트 핸들러라는 것을 별도로 지원한다! 메모 ..