전체 글 (23) 썸네일형 리스트형 5 TCP 기반 서버/클라이언트 2 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 TCP 기반 서버/클라이언트 1 4-2 TCP 기반 서버, 클라이언트 구현 TCP 서버의 기본적인 함수 호출 순서 리눅스에서는 send/recv 대신 read/write를 사용하기도 한다. 윈도우에서는 send/recv만 사용할 수 있다. 윈도우에서 소켓은 closesocket()으로 닫는다. 메모 리눅스에서만 read/write는 파일을 다룰 때에도 사용하지만 send/recv는 소켓에서만 사용할 수 있다(대신 여러 옵션을 부여할 수 있다는 장점이 있다). 리눅스에서만 작동시키려면 read/write를 쓰고, 윈도우와의 호환성을 고려한다면 send/recv를 쓰는 것이 좋은 것 같다. 연결요청 대기상태로의 진입 소켓에 주소를 할당했다면, 이제 연결을 해도 된다고 알려야 한다. 즉, 소켓을 LISTENING 상태로 만드는 것이다. in.. 3 주소 체계와 데이터 정렬 3-1 소켓에 할당되는 IP 주소와 PORT 번호 인터넷 주소 Internet Protocol은 인터넷 상에서 데이터를 송수신할 목적으로 컴퓨터에게 부여하는 값이다. 즉, 네트워크 상에서 컴퓨터를 잘 찾아가기 위한 주소라고 할 수 있다. IP 주소는 IPv4와 IPv6로 나뉘는데 둘의 차이점은 사용하는 바이트 수이다. 원래 사용하는 것은 IPv4인데, 인터넷이 워낙 규모가 커지다 보니 4바이트로는 한계가 있어 16바이트의 IPv6가 점점 도입되는 추세이다. IPv4 기준으로 IP 주소는 네트워크 주소와 호스트 주소로 나뉜다. 그래서 데이터는 네트워크(= 라우터)에 먼저 전송되고, 이 라우터에서 호스트로 전송하는 것이다. 메모 아주 간단하게 말하면 네트워크는 호스트와 라우터들의 집합이다. 호스트는 서버나 .. 2 소켓의 타입과 프로토콜의 설정 프로토콜 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) 정보를 전달.. 1 네트워크 프로그래밍과 소켓의 이해 과제하면서 공부하는 거라 틀린 내용 있을 수 있음.. 소켓 Socket 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있게 하려면 어떻게 해야 할까? 일단 두 컴퓨터를 어떤 식으로든 연결해 줘야 하는데 이는 인터넷이라는 거대한 네트워크가 있으므로 해결이 된다. 그리고 이를 기반으로 데이터를 송수신하는 소프트웨어적인 방법을 고민해야 하는데, 이것도 운영체제에서 소켓이라는 것을 제공하므로 쉽게 풀린다. 그냥 네트워크 상에서 데이터를 주고받기 위해 필요한 것이 소켓이다! 정도로 이해하면 될 것 같다. 참고) 소켓이라는 표현은 전기를 공급받기 위해 소켓을 꽂는 것처럼, 데이터의 송수신을 위해 인터넷이라는 네트워크 망에 연결한다는 의미이다. 또는 네트워크를 통한 두 컴퓨터의 연결 자체를 뜻하기도 한다. 전화 받는 .. [백준/C++] 27893 특별한 드롭킥 https://www.acmicpc.net/problem/27893 27893번: 특별한 드롭킥 NLCS Jeju의 구조는 생각보다 부실해서, 벽이나 문 등을 드롭킥으로 부술 수 있다. NLCS Jeju의 복도는 1차원 수직선으로 모델링할 수 있으며, 동호의 현재 좌표는 $x=0$이다. 동호는 $x=N$에 있는 교실로 www.acmicpc.net 조금 까다로웠던 문제. 맞왜틀 어떻게 풀어야 할지는 생각했는데, 그게 코드를 구현하는 관점에서는 조잡한 풀이여서 오래 걸린 것 같다. 다 풀고 나서 다른 코드들을 보니 확실히 그런 생각이 들었다. 그럼 시작! 동호가 장애물을 놓는 경우는 크게 두 가지로 나눌 수 있다. 1. 장애물 옆에 놓는다 ..XX.. 2. 장애물만 덩그러니 놓는다. ..X...X 조금 더 .. [백준/C++] 13334 철로 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 철로를 어떻게 움직일 것인가? 한 칸씩 움직일 필요는 없다. 부담스럽기도 하고, 어떤 구간은 경로가 위치하지 않을 수도 있어 낭비되는 구간이 생긴다. 최대한 철로의 시작이나 끝부터 경로가 바로 포함되도록 하는 게.. 이전 1 2 3 다음