ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [펌] [강좌2] TCP 에코서버와 에코클라이언트 제작하기(이해부분 중요!..
    프로그래밍/네트워크 2005. 6. 30. 00:21

    첨으로 써보는 강좌이지만 정말 지금까지 내가 참고했던 강좌들의 필자님들이 존경스러워집니다.

    정말 별거아닐꺼같은데 손이 많이 가는군요. ^^;

     

    오늘은 저번강좌에서 말했듯이에코서버와 에코클라이언트를 만들어보겠습니다.

    우선은 무엇보다도 중요한 동작 원리에 대해서 알아보겠습니다.에코란 쉽게생각해서메아리라고 생각하시면됩니다. 간단한 동작원리를 살펴보면 각각 한개의 에코서버와 에코클라이언트를 실행합니다. 접속이 성공한 에코클라이언트는 서버에 입력메시지를 보냅니다. 메시지를 받은 서버는 바로 입력받은 메시지를 되돌려주고 클라이언트는 서버로 부터 받은 메시지를 화면에 출력합니다.

    잘이해가 안가신다구요?

    그럼 아래그림을 참조하세요.

    사용자 삽입 이미지

     

    이제좀 이해가 가세여? 후~ 다행이네여

    우선 중점으로 보실것이 산의 역활과 사람의 역활입니다.에코서버를 의미하고사람에코 클라이언트를 의미합니다. 우선사람"야호~"하고 메아리를SEND(보내기)합니다. 그메아리를 기다리고 있던메아리RECV(받기)합니다. RECV한 메아리를산은 바로다시사람한테

    SEND(보내기)합니다. 그럼 사람은 본인이 보낸 "야호~"를 받게 되는거죠. 재밌죠?

     

    그럼 실질적 TCP 에코서버와 클라이언트를 만들기 위해 알아야할 구조도를 살펴보겠습니다.

     

    사용자 삽입 이미지

     

    일반적TCP 에코서버와 클라이언트 구조를 다시 제편성 한 구조입니다.

    어떤점을 재편성했냐구요 바로 파란점선이 있는 부분입니다. 궁금하신분들은 다른 에코서버 구조도를 확인해보십시요. 예전에 제가 공부할때 이해가 잘안되었던부분이라 나름대로 자세히 표현해보았습니다. 자그럼 이제 정말 긴장하고 준비하셔야 합니다. 각번호의 설명을 보시고 그림을 같이 참조해서 보셔야합니다.

     

    (1) 저번강좌에 말한 소켓을socket함수를 이용하여 생성하는 부분입니다. 이부분은서버의 소켓이니 바로 콘센트의 역활을 할 소켓을 말하겠죠?

     

    (2) 소스상에서 자세히 설명하겠지만 방금 만든서버소켓에 대한 연결설정정보를bind함수를 이용하여  설정하는부분입니다. 쉽게 말해서 콘센트는 만들었는데 위치와 모양, 안정장치에 대한 처리겠죠?

     

    (3) 역시나 소스상에서 자세하 설명하겠지만 모든 준비가 완료된 소켓을 listen함수를 이용하여 실제로 가동하는 부분입니다. 일반적으로 가장 눈의 띄는 일은 한번에 접속을 대기할수있는 지의 인원수를 설정하는 부분이기도 합니다.

     

    (4)(5) 중요한블록의 개념을 알아야하는 부분입니다.accept함수를 이용하는 부분으로 완성된 콘센트는 실질적으로 전자제품이 연결될때까지는 전기가 통하지 않습니다. 왜요? 당연히 필요가 없기 때문입니다. 마찬가지로 모든 준비가 끝난 서버 소켓은 자신의 서버에접속할 클라이언트가 있을때까지 더이상진행하지 않고 멈춰있는 상태를 말하지요.

    이걸블록상태라고 하는데 쉽게 여러분들이 scanf함수를 배울때 입력이 들어가기전에는 절대 진행하지 않는 그상태를 생각하면되는거죠.

     

    (6) 이부분은 당연히 클라이언트만 간절히 기다리고있는클라이언트의 소켓생성쉽게 다시말해서 플러그를 제작하는 부분이겠죠? 역시 제작방법은socket함수를 이용합니다.

     

    (7)(8) 자드디어클라이언트가 서버에connect함수를 이용하여접속하는 부분입니다. 아까말했듯이 클라이언트만 오기만을 간절하게 기다리는서버의 블록상태가 풀리는 부분이죠. connect함수를 통해 접속을 시도하면 accpet함수에서 걸려있던 블록이 풀리면서 다음으로 진행하게됩니다.

     

    (9) 메아리의 원칙은 좀전에 말씀드렸죠 여러분도 알다싶이 산은 메아리를 치지 않습니다. 왜죠? 당연히 말을 못하니까요 ㅋㅋ 그럼 항상 산은 무엇을 하고있을까요? 당연히 사람이 메아리 치기만을 기다리고 있는 거죠. 바로 이부분이 그부분입니다.서버는 클라이언트가 메아리(메시지)를 보내기를 기다리면서 방금깼던 블록 상태를recv함수를 통해 다시 들어가게됩니다.ㅠㅠ 불쌍하죠? 이렇게 블럭상태에 들어간이유는 클라이언트가 언제 메시지를 보낼지 모르기 때문입니다.

     

    (10) 혼자서 힘들게 기다리고 있는 산을위해 자 드뎌 소리를 지를때입니다. "야호~"!!

    scanf함수를 통해 우린 우선입력을 하겠죠.

     

    (11) 방금입력한 내용을 버퍼에 실어서 걍 <ㅑㅇ~~~~send함수를 이용하여서버에게쏴버리는 부분입니다.

     

    (12) "야호~" 소리를 지르는 순간 사람은 무엇을할까요? 네~ 방금 자기가 지른 소리가 언제쯤이나 메아리가 되서올지 귀에 손을 가볍게 올리면서 소리고 올때를 기다리겠죠? 클라이언트역시recv함수를 통해 본인이 보낸 메시지가 다시오기를 기다리는블록상태에 접어듭니다.

     

    (13) 가만히 졸고있던 서버에게 날라온 깜짝놀랄 한마디 "야호~". 드뎌 서버는 잠에서 깨어나겠죠?자그럼 다음에 무엇을 할까요? 모르시겠다고요? 아까 말씀드렸던 산(서버)의 역활이 뭐였죠? 바로 메아리죠. 방금 날라온 말을 받은 순간블록상태가 풀린 서버는send함수를 이용하여 다시 클라이언트에게 쏩니다.<ㅑㅇ~~~~~

     

    (14) 드뎌 한번의 메아리가 끝났습니다. 근데 영시원치가 않죠? 여러분 산에 올라가면 메아리 한번치고 옵니까? 네? 그런다구요 ㅡㅡ; 그럼 가정을 들죠 메아리를 목이 쉬여버릴때까지 쳐봅시다. 가슴의 한을 풀어보는거죠.

    그러기위해선 어떻게하죠 지금까지 했던(9) -> (14)까지의 내용을 반복해야겠죠.

     

    (15) 이제 목이 쉬여버렸네요. 내려가야죠. 이부분은closesocket이란 함수를 통해 그동안 연결되었던 서버와 클라이언트의 연결 소켓을 끈어버리는 부분입니다.다시 소켓으로와서 말하는건데 전자제품을 다쓰면 어쩌죠? 당연히 플러그와 콘센트를 끈어버리겠죠?

     

    자!! 드뎌 전체적인 TCP 서버와 클라이언트의 동작의 설명을 마쳤습니다. 제 경험상 그리고 제가 너무나 존경하는장석규 선생님의 말을 빌어 말씀드리면네트워크의 프로그래밍은 코딩은 그리중요한것이 아닙니다.20%만을 좌우할뿐입니다. 항상 책이나 소스를 참고해서 네트워크 프로그래밍을 공부하신분들은 다만드시고 고개를 절레절레 흔듭니다. 그건 바로 작동은 되는데 응용이되지 않기 때문입니다. 이처럼네트워크 프로그래밍은 50%가 이해가 중점을 이루어야 합니다.그럼 나머지 30은 무엇이냐구요? ㅋㅋ 이건 비밀이에요. 나중에 알려드리겠습니다. 그래야 끝까지 보시겠죠? 후~ 정신없이 여기까지 왔네요. 원래는 오늘 코딩까지 설명드릴라고 했는데 내용이 너무 많아 다음편으로 넘깁니다. 실망하지마시고 조금만 기다려주세요. 그래봤자 하루니까요 ^^V

     

    그럼 여기까지JR.얼음벌레였습니다.

    강좌보신분들 저에게 힘을 원츄~ (덧클필수 아시죠?)

    그리고 다시한번 고수분들에게는 어쩌면 말도 안되는 말을 지껄이는지도 모를 초보인 저의 이강좌에 대해 용서를 빕니다. ^^

    혹시나 퍼가실분은 출저 밝혀주시고요.

    그럼 오늘도 좋은 하루되세요.

     

    질문이나 수정사항이 있을경우callstack@naver.com으로 메일주세요.

     

    댓글