총 삽질들 514

#018_Window_Network_네트워크 I/O(입출력) 모델

안녕하세요 삽잡이입니다. 이번 시간에는 Window Socket Programming에서 배우는 내용중에입출력 즉, 네트워크 통신을 하기 위한 효율적인 여러가지 모델들에 대해서 알아보도록 하겠습니다.즉, MS사에서 제공하는 다른 기능들에 대해서 차례대로 알아보자 이겁니다. 지금부터 배워볼 모델들은 효율적인 네트워크 프로그램을 만들기 위함입니다.우리가 알아볼 I/O 통신 방식은 6가지인데이 중에서 이미 한가지 모델 방식을 친숙할 것입니다... 그 하나가 바로 '쓰레드 모델링'을 사용한 네트워크 입출력 통신이니깐 말입니다...이 외에도 Window Socket Library에서 제공하는 모델 방식이 5가지가 더 있다 이겁니다... 블로킹 소켓은 무조건 쓰레딩 방식을 사용하냐 하면 그건 아니지만 대부분 쓰레딩..

#017_Window_Network_Non Blocking Socket

안녕하세요 삽잡이입니다. 이번 시간에는 Non Blocking Socket에 대해서 배워보려고합니다. 소켓에는 두 가지의 종류가 있습니다.바로, '블록킹 소켓'과 '넌 블록킹 소켓'이 있는 것입니다. 필자가 Nework Programming 에 대해서 글을 올리며 사용했던 방식은 모두 블록킹 소켓이었습니다.블록킹 소켓을 사용한다면,블록킹 소켓 내 IO 함수들은 자신의 목적(기능)을 완료할 때 까지 Blocking 상태에 놓입니다.이 블록킹 상태에 놓이는 I/O 함수들은 accept(), recv(), send(), connect() 함수등과 UDP에서 사용하는 recvfrom(), sendfrom()함수 등이 있습니다.즉, 이와 같은 I/O 함수들이 자신의 목적을 완료할 때 까지 Blocking 상태로 ..

[삽잡이] 메모리 복사과정

메모리 복사를 하는 'memcpy' 함수, 어플리케이션의 버퍼안에 데이터를 TCP 수준의 Send 버퍼에 복사를 시켜주는 'send'함수, TCP 수준의 Recv 버퍼안에 데이터를 어플리케이션의 버퍼에 복사를 시켜주는 'recv'함수 등등 ... 데이터를 복사시키는 함수의 그림은 아래의 그림과 같다. 저장하고자하는 메모리의 주소(Target Address)에복사를 할 메모리의 시작 주소(Original Address)부터인자로 넘긴 크기(Size)만큼 복사를 해준다.

#016_Window_Network_고정 길이 전송 방식과 가변 길이 전송 방식

안녕하세요 삽잡이입니다.이번시간에는 가변 길이 전송 방식에 대해서 알아보려고합니다. 고정 길이 전송 방식이란, 동일한 길이의 데이터를 날리고 동일한 데이터의 길이를 받는 전송 방식을 말합니다.예를 들어서 512바이트를 전송하게 되면, 이 바이트를 넘지 않아야된다는 것입니다. TCP 네트워크 송신은 데이터의 경계가 없기 때문에우리가 그 경계를 만들어줘야할 필요성이 있어서 이와 같은 방법을 사용하는 것입니다.즉, 몇 바이트가 보내질지, 우리가 몇 바이트를 받게 될지 모르니깐오류를 방지하고자... 정확한 데이터 송수신을 하고자 '고정 길이 전송 방식'을 사용한다는 것입니다. 그런데 사실, 데이터의 길이가 얼마나 올지 모를 때는 고정 길이 방식을 잘 사용하지 않습니다.예를 들어 512 바이트만큼 고정 길이로 사..

#015_Window_Network_프로토콜 설계, 패킷 설계

안녕하세요 삽잡이입니다. 이번 시간에는 프로토콜 및 패킷 설계에 대한 중요성에 대해 생각해보려고합니다. 네트워크 프로그래밍을 할 때에는여러가지의 이벤트 즉, 여러가지를 감안해야할 '사건'들이 많습니다.예를 들어서 데이터 하나를 전송할 때, 여러개를 전송할 때,한명이 보낼 때, 여러명이 보낼 때 등등 말입니다... 우리는 상황별로 데이터를 어떻게 전송해야할지에 대해 '정의'를 해야합니다.우리가 해야할 정의들은 바로,'데이터 패킷 설계', '데이터 시트 설계', '데이터 송수신 설계'라고 부릅니다. 이와 같은 정의들을 미리 해두고 코드를 구현해야지...그렇지 않게 된다면 에러 폭탄을 껴안고있는 꼴이 됩니다. 데이터를 주고받을 때에는 반드시 어떻게 주고받을지에 대한 '프로토콜'을 정의해야합니다.이를 하지 않는..

[삽잡이] 원자적인 연산의 중요성

쓰레드는 독립적인 존재입니다.여러개의 쓰레드가 실행한다면, 각기 자유롭게 실행이 될 것입니다.하지만, 쓰레드를 여러대를 사용할 때에는 반드시 신경을 써야할 일이 있습니다.바로, '동기화'입니다. 여러 쓰레드가 열심히 자기 할일을 하고 있는데,하나의 '공유 변수'를 사용하게 될 때 문제가 발생합니다. 예를 들어, A라는 쓰레드가 데이터를 지우고 있는데B와 C라는 쓰레드는 그 사실을 모른채 A가 지운 데이터에 접근하고자하면 어떻게 될까요? 따라서, '원자적(Atomic)인 연산에 의해 공유 메모리는 아주 잘 보호되어야합니다.'원자는 더 이상 나눌 수 없는 최소 단위의 기본 입자를 말하지요...원자적 연산이란, 따악 하나만... 단 하나만 연산하는 것을 말합니다.연산을 수행하면서 그 누군가의 방해도 받지 않고..

#014_Window_Network_고정 길이 데이터 전송

안녕하세요 삽잡이입니다. 이번 시간에는 다양한 데이터 전송 방식중에'고정 길이 데이터 전송'에 대해서 알아보려고합니다. 클라이언트와 서버간에 데이터를 주고받을 때... 즉, 통신할 때 어플리케이션 버퍼에 데이터를 입력받고 send 함수를 통해 TCP send 버퍼에 복사해왔었습니다.반대로, recv 함수를 통해 TCP recv 버퍼에서 데이터를 받아와어플리케이션 버퍼에 저장을 받으며 통신을 진행했었습니다. 이렇게 3바이트를 보냈다면 3바이트를 전송받고 7바이트를 보내면 7바이트를 받으며 통신을 진행할 것이라는 소리입니다. 이와 같이 데이터를 주고 받을 때 주의해야할 사항이 있습니다.TCP 방식을 사용해야할 때인데,TCP는 stream 방식을 사용합니다. UDP는 반대로 Datagram 방식을 사용하지요...

#013_Window_Network_클라이언트 서버 통신 (실행 및 연결 확인)

안녕하세요 삽잡이입니다. 이번 시간에는 TCP 서버와 클라이언트간 실제로 실행이 되는 결과를PC에서 확인하고, 연결 역시 확인해보도록 하겠습니다. 지금까지 배워온 대기 소켓, 통신 소켓을 실제로 확인해보는 것입니다.서버와 클라이언트를 통신하기 위한 코드를 보는 것이 아닌,결과 창만을 확인해보도록 하겠습니다. TCP 서버에서 listen() 함수가 성공적으로 return 이 되면 대기 큐가 생긴다고 했습니다. cmd 창에서 netstat -a 명령어를 쳐서 네트워크 연결 상태를 확인해보겠습니다. 본인은 9000번 포트를 통해 소켓을 하나 생성했습니다.이에 'LISTENING' 상태의 TCP 서버가 존재함을 확인할 수 있습니다.즉, 대기 소켓의 정보를 확인한것입니다.'로컬 주소'는 내 정보를 말하는 것이고 ..

#012_Window_Network_클라이언트 서버 통신 (소켓 관점)

안녕하세요 삽잡이입니다. 이번 시간에는 소켓 관점에서 본 클라이언트와 서버간 통신에 대해서 살펴보도록 하겠습니다. 참고로, 이전 내용들을 이해하지 않고 오시면 이해하는데 불편함이 있으실 수 있으니혹여나 처음 접하시는 분들은 이전 글들을 참고해주시길 바랍니다. 우리가 클라이언트와 서버의 통신 때 사용하던 send 함수의 예시입니다.이때 첫번째 인자인 '통신 소켓 핸들'은 클라이언트와 서버간에 통신을 위해 사용됩니다.즉, 통신 소켓의 핸들에는 현재 자신의 IP도 있지만, 상대방의 정보들도 알고 있다 이겁니다.다시말하면, 통신 소켓의 핸들을 통해 서로 연결되어있는 서버와 클라이언트간에 통신이 가능해지는 것입니다. send() 함수를 봤으니 이제 잠시 resv() 함수를 볼까요?recv() 함수에는 통신 소켓과..