C# 자동업그레이드 2008. 12. 2. 01:19

    자. 얼핏 적는다는게 벌써 여기까지 왔다.

    네트웍을 처리해야 하는데 기초적인 네트웍을 살펴보자.

    서버는 이미 앞에서도 대충 이야기 했으니

    기본적인것만.. 소스를 나타내 보자.

    clip_image001

    예를 들어서 이런식으로.. 서버를 코딩하고

    클라이언트를..

    clip_image002

    이런식으로 했다고 하자.

    그럼.. 결국 서버와 클라이언트는 정보를 주거니 받거니 할것이다.

    서버의 출력창 모습은

    clip_image003

    클라이언트의 출력창 모습은..

    clip_image004

    이런식으로 나오게 될것이다.

    위의 코드를 대충 까발려서 머리에 안들어 올것인데

    A -B에서 하나씩 정보를 주고 받고..를 하는것이다.

    Bow를 보내면.. bowOK를 보내고

    End를 보내면 endOK를 보내는 식으로 서로의 정보를 주고 받는 모습을 가볍게 보여주고자 하는 코딩이다.

    왜 이걸했냐?

    결국 자동업그레이드는

    처음 접속해서 접속이 올바르게 되었다면..

    두번째로는.. 업그레이드 할 내용을 받아야 하고

    세번째로는 업그레이드의 대상파일을 받아야 한다.

    네번째는.. 그 파일을 기록해야겠다.

    즉 준비적인 sign이 있어야 한다는 이야기다. 포수와 투수처럼 미리 달라고 해야되는 사인을

    표현해주기 위해서 이렇게 코딩을 했다.

    예를 조금 더 들자면 아이디와 패스워드를 받는다던지 또는 서버의 경우 하나의 프로그램 프로젝트에 대해서만 업그레이드를 수행할 이유는 없는것이다. 즉 클라이언트에서 그 프로그램의 아이디를 요청하는것에 대해서만 정보를 전달해서 업그레이드를 해주기만 하면 된다.

    그런 실제적인 작업을 위해서는 정보의 교환이 필요하게 된다.

    하지만 우리는.. 단순 그리고 무식하게 코딩을 처리하도록 하자.

    1. 서버로 접속을 하게 되면 무조건 Ready를 받게된다.

    그러면 클라이언트는

    ID와 password 그리고 업그레이드 받아야 되는 고유 programID를 기준날짜등을

    담아서 dictionary로 개체 전송을 하자.

    2. 서버에서 정보를 받고나서

    상태를 보관하는 특정한 변수에 LoginOK = true같은 설정을 처리하고(아이디 패스워드가 정상일때)

    "LoginOK"라는 문자를 클라이언트에게 보내도록 하자.

    물론 "LoginFalse"라고 보내면 접속을 끊자.

    3. 서버

    getFile이란 정보를 취득하면 LoginOK라는 변수에 true 인지 확인후 파일을 담고 있는 dataset을 전송하자.

    서버와 클라이언트간의 정보이동을.. 그림을 그려주고 싶지만.

    그러기에는 ^^ 조금 안습이다.

    실제적인 코딩을 하면서 다시금.. 설명이 들어가니 그때 보고 이해를 하자.

    ------------------

    자 기초적인건 머리에 넣었다고 생각한다.

    TCP의 통신에서 가끔 엉뚱한 상상을 하는 사람이 있어서 또 예제를 더불어 놓는다.

    그림을 그려야 하는데 말이다. 참 힘들다. 그러니 그냥 가자.

    일단.. 가끔가다보면 substring을 사용하는 사람들이 있다. 물론 이걸 사용하지 말라는건 아니고 기본적으로 Buffer란 개념이 없기 때문이 아닌가 하고 짐작해 본다.

    또한 (이번에는 링크를 안때리겠다.) 최근의 질단란을 뒤지다 보면

    TCP가 끝이 없다. 라든지 같은 말들이 있는데 틀린말은 아니다. 단지 그것을 운영하는 방법이 필요할 뿐이란 것이다.

    TCP는.. 우리가 소켓을 만들면 하나의 버퍼가 준비가 된다. 이 버퍼에는 상대방이 보낸것이 고스란히 저장이 되는것이다. 그럼 뭔가 ? 우리는 그 버퍼에서 가져다가 사용만 하는것이란 이야기다.

    예를 들어서

    clip_image005

    이런식의 코딩을 했다고 하자.

    그럼.. 우리는 이것이 한번 보내지고 그 데이터를 적시에 받지 못하면 데이터가 사라진다고 생각하는것이다. 누가 이런생각을 하는건지 모르겠으나. 가끔 보다 보면.. 그런사람들이 있다.

    이 데이터는 고스란히 상대편의 버퍼에 저장이 된다.

    상대편의 코드에 이런식으로 코딩을 해보자.

    clip_image006

    이 코드는.. 2바이트씩 받아서 그것을 출력해주는 함수이다.

    이걸 이용해서 이런 코딩을 해보자.

    clip_image007

    즉.. 2글짜씩 두번 뿌려주고.. 3초 있다가.. 버퍼에서 다시금 2바이트 가져오고

    다시 3초 있다가 2바이트를 가져온다.

    clip_image008

    내가 신이 아닌인상 이렇게 2개만 잡을수는 없을것이다.

    clip_image009

    이제 3개를.. 즉 이렇게 할수 있다는것은

    clip_image010

    이런식이 된다는것은 무엇인가?

    이미 클라이언트에서 정보를 보낸것은 종료했다. 정보는 이미 보내고 가져오는것은 늦게 가져올수 있다는 이야기다.

    왜냐면.. 그 정보들은 내 버퍼에 있기 때문이다.

    이번에는

    clip_image011

    이렇게 보내보자.

    당연히 결과는 동일하다. 이미 버퍼의 앞쪽에 위치한것이 나가지 않는이상 뒤의 것을 읽지 못한다.

    버퍼를 비워주지 않는이상 뒤의것을 받아들일수는 없다.

    물론 읽기야 읽지..

    clip_image012

    저기 보면.. Offset이라고 적혀 있는것이 보일것이다. 그래서 저게 오프셋이다.

    버퍼의 내용을 어떻게 가져오는냐 하는 이야기란 말이다.

    내가 보낸것은 버퍼에 들어가지 바로 받지 않는다고 못 받는것은 아니다.

    물론 못 받는 통신이 UDP다 이건 지금 이야기 할것이 아니니 다음에 이야기 하고

    TCP는 기본적으로 버퍼 구조라는 개념을 머리에 확실히 넣어줘야 잘 사용할수 있다.

    TCP의 통신은 실시간이 아니다.(물론 실시간이다만.. 어케 적당히 표현이 안된다.)

    당신의 기초개념이 흔들이면 여지없이 코딩은 끝장나게 흔들린다는 이말이다.

    자 다시금 돌아와서

    clip_image013

    이번에는. 4byte씩 읽도록 했다. 위의 코딩의 890 뒤에서 끊어지는 신호는 없다.

    바로 ABC가 들어온다는 것이다.

    자 그럼 어떻게 할까? 이문제는 당신이 풀어야 한다. 왜냐면 프로그래머는 규칙에 따라서 살기도 하지만 항상 규칙을 만드는게 프로그램의 즐거움 아니겠는가?

    Ps) 데브에 언제 트랙백 기능이 생길런지는 모르겠다만..

    만약 이런 오류에 시달리게 된다면..

    http://www.hoons.kr/board.aspx?Name=QACSHAP&Mode=2&BoardIdx=14344&Key=&Value=

    http://www.codesos.com/book/network/WSACancelBlockingCall.html

    이문서를 참고해라.

    쉽게 말하자면.. 먼저쓰레드 날리고 소켓 날리면 될것이다.

     

    clip_image015

'C# 자동업그레이드' 카테고리의 다른 글

자동업그레이드 10  (0) 2008.12.02
자동업그레이드 9  (0) 2008.12.02
자동업그레이드 8  (0) 2008.12.02
자동업그레이드 7  (0) 2008.12.02
자동업그레이드 6  (0) 2008.12.02
자동업그레이드 4  (0) 2008.12.02
자동업그레이드 3  (0) 2008.12.02
자동업그레이드 2  (0) 2008.12.02
자동업그레이드 1  (0) 2008.12.02
posted by 삶의여유로움
: