총 삽질들 514

#011_Window_Network_클라이언트 서버 통신 (데이터 관점)

안녕하세요 삽잡이입니다. 이번 시간에는 서버와 클라이언트간에 통신을 '데이터 관점'에서 바라보는 시간을 가지겠습니다. 즉, 데이터 관점에서 클라이언트와 서버가어떻게 데이터를 주고 받는지를 확인하겠다는 것입니다. A와 B라는 두 대의 컴퓨터가 있다고 가정해보겠습니다.A 는 서버이고 B는 클라이언트입니다. 어플리케이션 수준에서는 소켓의 핸들만을 알 수 있습니다.그리고 OS는 TCP(전송 계층) 수준, IP(인터넷 계층) 수준, 데이터 링크 계층을 관리합니다.즉, 우리가 어플리케이션을 만들고 통신을 하려고 해도 어플리케이션 계층의 수준이 아닌 이외의 수준은 OS가 알아서 처리해준다는 것입니다. 소켓을 만드는 동시에 OS는 TCP 계층 수준에서 Send 버퍼와 Recv 버퍼를 같이 만듭니다. 각각 서버와 클라이..

#010_Window_Network_클라이언트 서버 통신 (TCP 클라이언트 - 코드)

안녕하세요 삽잡이입니다. 이번 시간에는 TCP 서버가 데이터를 받고 뿌리는 현장을 코드와 함께 살펴보겠습니다. TCP 클라이언트도 다르지 않습니다. 우선 소켓을 하나 생성합니다. 그리고 클라이언트도 소켓 구조 주소체에 정보들을 채워넣습니다.서버에서 배웠는데.... 복습하는겸 다시 한번 가볍게 살펴보자면...소켓 주소를 채우는 것입니다. '주소 체계', 'IP', '포트번호'이들을 묶어서 소켓 주소라고 부르며, 우리가 생성한 소켓에 집어넣는 것입니다. 여기서 주소를 보시면 '127.0.0.1' 이라고 채워져 있는 코드를 확인할 수 있습니다.이는 루프백 주소라고 부르는데, 라우터를 거치지 않습니다.내 컴퓨터 내에 OS에서는 TCP, IP, 데이터 링크 수준들이 존재합니다.데이터를 주고 받기 위해서는 내 컴퓨..

#009_Window_Network_클라이언트 서버 통신 (TCP 서버 - 코드)

안녕하세요 삽잡이입니다. 이번시간에는 TCP 서버에 대한 실제 코드를 보면서 공부하는 시간을 가지도록 하겠습니다. 우선 통신을 위해 서버를 만들어야겠지요...그 중 가장 우선이 통신을 하기 위한 객체를 생성해야합니다. 소켓이지요....정확히는 소켓의 핸들이겠지만요... 첫번째 인자는 주소 체계를 설정하는 인자입니다. 주소 체계란, 주소 지정 방법을 가리킵니다. 프로토콜에 따라 주소를 지정하는 방법이 다르기 때문에 설정을 해줘야하는 것입니다. 통신을 하기 위해서 여러가지 채널들을 제공합니다.예를 들어 군사망, 범용망, 그 외 특수한 망 등등을 말입니다. 이를 구분짓는 정의 값을 첫번째 인자로 결정하는 것입니다. 통신영역을 설정하는 함수로써, 인터넷 영역을 사용할지 , IPv4 방식을 사용할지즉, 어떻게 통..

#008_Window_Network_클라이언트 서버 통신 (TCP 클라이언트)

안녕하세요 삽잡이입니다. 이번 시간에는 지난시간에 이은 TCP 클라이언트에 대해서 알아보려고합니다. 클라이언트는 가장 먼저 socket()함수를 통해 통신하기 위한 수단인 socket을 생성해야합니다.그 다음 클라이언트는 자신이 원하는 서버에 접속을 해야합니다.따라서, connect()함수를 제공해줍니다. 서버와 연결하기 위해서 필요한 함수이지요...해당 함수 안에는 일반적으로어떤 프로토콜 체계를 사용할지, 어떤 IP를, 어떤 포트를 사용하겠다는 정보를 포함시켜야합니다. socket() 함수까지는 통신 소켓이 아니지만, connect()함수가 성공하게 되면 통신 소켓이 됩니다.참고로, 클라이언트는 서버가 아니기 때문에 대기 소켓이 없습니다.단지, 통신 소켓을 가지고 있을 뿐이지요...통신 소켓도 여러개를..

#007_Window_Network_클라이언트 서버 통신 (TCP 서버)

안녕하세요 삽잡이입니다. 아... 속이 안좋고... 머리가 아픕니다...오늘은 평소보다 더!중간 중간 했던 말들을 또 하는 루프 사태가 발생할 수 있으니... 양해바랍니다....허허허.... 이번 시간에는 클라이언트 서버 프로그램에 대해서즉, 클라이언트와 서버가 어떻게 통신을 하는지에 대해 알아보겠습니다. 우선, 이 글은 TCP/IP 프로토콜 기반의 통신 방식을 알아보려고 하는 글입니다.TCP/IP 프로토콜 말고도 여러가지 프로토콜들이 존재하는데,각 프로토콜마다 통신하는 방법이 다릅니다.그 여러가지 프로토콜 중에서 일반적으로 가장 널리 사용하는 TCP/IP 프로토콜 통신을 배워보겠다는 것이지요. 네트워크에서 많이 사용하는 모델 중 하나가 바로 '크라이언트와 서버 모델'입니다. 일반적으로 서버는 한 대가 ..

#007_Window_Network_오류 메시지 확인

안녕하세요 삽잡이 입니다. 이번 시간에는 간단하게 오류 메시지를 확인하는 함수들에 대해 알아보겠습니다. WSAGetLastError() 함수는 오류 메시지를 확인해주는 함수입니다. 원래 WSA가 없이 GetLastError 라는 함수가 있습니다.윈도우 네트워크 API 답게 앞에 이름을 붙여준 것이지요.... 모든 쓰레드는 자신만의 에러코드를 받는 방이 있습니다.즉, 4바이트 짜리 정수를 받는 방이 있다는 것입니다.각 쓰레드 별로 해당 함수를 호출하게되면 에러 코드를 받는 방에서 에러 코드를 받아오게 됩니다. 커널 오브젝트와 관련된 어떤 함수를 호출했을 때 에러를 발생하게 되면 그 에러 코드 값을 에러 코드를 받는 방에 보관을 하게 됩니다. (말이 어렵군요...)그 정보를 꺼내 오는 함수가 바로 GetLa..

#006_Window_Network_IP, DNS

안녕하세요 삽잡이입니다. 이번 시간에는 IP와 DNS에 대해서 생각해보려고합니다. 여러분은 Domain Name Server를 아십니까? DNS라고 부르는데요...클라이언트와 서버가 있다고 생각해봅시다.클라이언트가 서버에 접속하려는데, 따라서 클라이언트의 위치를 알아야겠지요.... 그것이 바로 IP입니다.반대로, 서버도 위치가 있어야지 접속을 할 수 있지 않겠습니까...이 위치도 IP를 말합니다. 서버는 어차피 클라이언트가 붙게되면 IP를 알게 되니까 상관 없지만,처음에 접속할 때 클라이언트는 서버의 위치 즉, IP를 모르면 접속을 할 수 없습니다. 우리가 인터넷을 접속을 위해 sapzapee.tistory.com 과 같이 입력을 하고 접속하면 원래는 IP로 접속 되는 것입니다.사실, 다음, 네이버도 모..

#005_Window_Network_구조체 멤버 정렬

안녕하세요 삽잡이입니다. 이번 시간에는 구조체 멤버 정렬에 관해 배워보도록 하겠습니다. MSG라는 구조체의 크기는 몇일까요?char 1바이트 int 4바이트 double 8바이트... 총 13바이트가 나오지 않을까요? 하지만, 16바이트가 출력이 됩니다. 제가 계산을 잘못한 것일까요?아닙니다. 16이 나오는 것이 맞다는 것입니다. 그 이유에 대해서 알아보도록 하겠습니다. 자... 그런데 감히 잡히시지 않습니까?저기 저 주석 처리된 메크로가 의심스럽니다. 아무튼...이 문제는 구조체 바이트 정렬에 의해서 생겨난 일입니다. 우선 말씀드리고 싶은 말이 있습니다. '구조체를 함부로 날리지 않는다. 구조체를 함부로 받지 않는다.'만약, 통신하는 다른 PC와 서로 구조체 정렬 방식이 다르다면,연산이 잘못되는 문제가..

#004_Window_Network_바이트 정렬

안녕하세요 삽잡이입니다. 이번 시간에는 바이트 정렬에 대해서 알아보도록 하겠습니다. 우선 바이트 정렬이 뭔지 알아보기 전에 변수 하나를 생성하고 그 안에 값을 채웠다고 해보겠습니다.그러면 데이터는 어떻게 채워질까요?채워지는 방법에는 두가지 방법이 있습니다. int n = 0x1234 라는 값을 초기화 했다고 가정해봅시다. n은 int형 변수로써 4개의 바이트를 가지고 있겠지요...위의 그림과 같이 데이터가 저장됩니다.그런데 왜 두가지가 표현됬을까요? 바로 두 방식이 모두 표준이기 때문입니다. 작은쪽의 주소에 끝값을 보관하고, 큰 쪽 주소에 앞쪽 값을 보관하고 있는 방법.작은쪽의 주소에 앞쪽 값을 보관하고, 큰쪽 주소에 끝 값을 보관하고 있는 방법. 작은 쪽 주소에 끝값을 저장한다고 해서 리틀 엔디안 방식..

#003_Window_Network_ 윈도우 소켓 초기화 및 종료

안녕하세요 삽잡이입니다. 이번 시간에는 기본적으로 네트워크 프로그래밍에 도움이 될만한 것들을 찾아서 알아보도록 하겠습니다. 네트워크 프로그래밍을 하면서 가장 기초적인 작업은바로, 윈도우 소켓을 장착시키는 것입니다. 너무도 당연하지요.... 윈도우 소켓도 종류가 많은데 가장 최신버전은 2.2버전입니다. 그 헤더는 winsock2.h이지요...이전 시간에 언급을 했었습니다. 윈도우 소켓을 사용한다는 것은 다른 PC와의 통신이 가능한 프로그램을 만들기 위해서라구요...우리가 통신을 하며 데이터를 주고 받는데 OS의 역할이 필요한데,OS가 역할을 하기 위해서는 통신을 위한 네트워크 lib가 필요하다고 했었습니다.물론 모든 기능들은 DLL 파일에 있겠지만, DLL의 암묵적인 연결을 지원하는 라이브러리 말입니다. ..