삽질의 현장/- 네트워크 프로그래밍

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

shovelman 2015. 10. 4. 01:38


안녕하세요 삽잡이입니다.


이번 시간에는 TCP 서버가 데이터를 받고 뿌리는 현장을 코드와 함께 살펴보겠습니다.



TCP 클라이언트도 다르지 않습니다. 우선 소켓을 하나 생성합니다.



그리고 클라이언트도 소켓 구조 주소체에 정보들을 채워넣습니다.

서버에서 배웠는데.... 복습하는겸 다시 한번 가볍게 살펴보자면...

소켓 주소를 채우는 것입니다. 

'주소 체계', 'IP', '포트번호'

이들을 묶어서 소켓 주소라고 부르며, 우리가 생성한 소켓에 집어넣는 것입니다.


여기서 주소를 보시면 '127.0.0.1' 이라고 채워져 있는 코드를 확인할 수 있습니다.

이는 루프백 주소라고 부르는데, 라우터를 거치지 않습니다.

내 컴퓨터 내에 OS에서는 TCP, IP, 데이터 링크 수준들이 존재합니다.

데이터를 주고 받기 위해서는 내 컴퓨터내에서 주고 받는다고 할지라도 반드시 라우터를 거쳐야됩니다.


만약, 네트워크 카드가 없다면, 라우터가 꺼져있다면 등... 제약이 생길 수 있습니다.

그런데 굳이 내 PC에서 데이터를 주고 받으려는데 라우터까지 갈 필요가 없지 않겠습니까?

따라서 네트워크 카드를 사용하지 않고 내 PC내에서 통신이 가능하도록 만든 주소가

바로 '루프백 주소'라는 것입니다.



TCP 스택이라고 부르는 전송 계층, 인터넷 계층, 데이터 링크 계증을 내려갔다가 다시 올라오는 것이지요...

이 TCP 스택만을 거쳐서 데이터를 송수신할 수 있게 된다 이겁니다.


아무튼... 소켓 주소 구조체를 채웠다면 이제 서버에 접속하고자 시도를 해야합니다.



첫번째 인자로는 소켓 핸들을, 두번째 인자로는 소켓주소 구조체의 주소를

세번째 인자로는 구조체의 크기를 넘깁니다. 

즉, 두번째 인자로는 접속 서버의 주소값이 들어가 있게 됩니다.


connect 함수가 TCP 서버의 접속 대기 큐에 들어가게 된다면

통신 소켓의 핸들을 받아와 이제 사용할 수 있게 되는 것입니다.

여기서 알 수 있는 것은 서버와 마찬가지로 

통신 소켓은 우리가 만드는 것이 아닌 OS가 만들어준다는 것이고,

TCP 클라이언트는 대기 소켓이 없다는 것을 알 수 있습니다. (당연한가요...)

마지막으로 알 수 있는 사실은 connect 함수 또한 block 함수인 것입니다.


왜냐, 접속 대기 큐에 들어가게된 TCP 클라이언트는 데이터를 입력받기를 대기하게 됩니다.

서버가 accept 함수를 호출해 통신 소켓을 만들게 되면

connect함수의 blocking 상태가 풀리고 통신이 시작되는 것입니다.

따라서 통신 소켓이 만들어지기 전까지는 blocking 상태에 놓이게 되는 것이지요...


그리고 이전 시간에 알아봤던

recv 함수와 send 함수를 통해 데이터를 주고 받게 됩니다.

마지막으로 closesocket으로 마무리를 하는 것이구요...


클라이언트는 서버에서 언급한 중복되는 내용들이 많아서 비교적 짧게 끝낼 수 있었습니다.


다음시간에 뵙겠습니다.

이상 삽잡이였습니다!