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

    자.. 상당히 정신이 없을것 같다.

    나름 쉽게 적는다고 쉽게 적었다만 오히려 쉽게 적는다고 더 코드가 왔다 갔다 하는덕에

    오해를 하지 않을까 싶다.

    하여간 전체 소스를 보게 되면 실제적으로 중요코딩은.. 10줄 이내고

    핵심적인건 100여줄이 안된다는걸 알게될것이다.

    크게 어려운게 아니니 쉽게 이해하리라 믿는다.

    자 이제 DS을 통해서 그 정보를 파일로 저장하는것을 해보자.

    clip_image001

    사실 저장은 따로 말할만하게 없다.

    그냥.. 하면 되는것이니 말이다.

    이제 모든게 처리되었다.

    프로세서를 통해서 실행하는것은 이미 알고 있을꺼라고 믿고

    또한 EXE 파일을 참조로 끌어들여서 최신버전을 체크하는것 또한 잘 할꺼라고 믿는다.

    아.. 별거아닌걸 하나를 빠뜨린것 같다.

    다운을 받고나서는 또는 파일로 다 기록을 한 뒤에는 자체적인 Lastdate 변수에 오늘받은것의 기준날짜를 기록해주고 그것을 기록해야 할것이다.

    그러면.. 다시 업데이트를 할때 기준날짜를 기준으로 해서 업데이트를 할것이 없으므로 인해서

    서버에 새로운게 있지 않는이상 업데이트가 되지 않을것이다.

    clip_image002

    이제 고민할것은 실제적인 이녀석의 실행이다.

    과연 어떻게 실행할것인가? 이것이 사실상의 코딩보다 더 중요한 입장이다.

    예를들어서 VS가 실행할때마다 업그레이드를 확인한다고 생각해 보자.

    또는 한글워드를 생각해보도록 하자.

    이런어플리케이션들은 실제적으로 자주운용이 되는 입장에서 여러모로 서버에게 부하가 가중될수도 있다. 그럼 어떤방식으로 운영이 되는가?

    한글워드의 경우 업데이트 프로그램이 별도로 있는입장에서 레지스트리를 이용해서 이 프로그램이 실행되는걸로 알고있다.

    하지만 네트웍 프로그램들을 살펴보자. Ndisk나 sun폴더 또는

    대신증권같은 소프트웨어를 보자. 이런것들은 실제적으로 항상 서버에서 전해주는 기준적인 프로토콜이 생명일뿐이 아니라 항상 네트웍으로 연결이 필요한것들이다. 이런경우의 소프트웨어는 항상 실행할때마다 업데이트를 체크해야 할것이다.

    그럼 우리가 만드는 소프트웨어는 어떻게 하는게 좋을까?

    그렇다 이건 당신의 문제라는 것이다.

    일단은 지금은 가볍게 함수를 하나 만들어서 처리를 하자.

    최종요약

    1. 이것은 소규모에나 사용될수 있는 업데이트다.

    즉 규모가 크면 불가하다. 만약 큰파일도 전송을 해야된다면 실제적인 파일은 데이타들은 외부에 둔상태로 있어야 한다. 즉 DB에 데이터를 넣지 않고 외부파일을 통신으로 전송하는 방식으로 하면 현재의 모든 문제는 (sirialize의 메모리 오류가 나오는 문제와 그외 등등)은 해결이 된다.

    또는 드물겠지만. 클라이언트에서 바로 DB로 접근을 해서 Dataset을 받아오는것도 나쁘지는 않다.

    하지만 이경우 DB접속패스워드의 보안상의 문제점 MDB를 이용할수 없고 대규모형 sql를 사용해야지 할것이다.

    2. 앞쪽에서 설명하지 않고 그냥 지나왔지만 실제적인 DB에서 쿼리는 Max를 사용해 주어서 중복되는것은 inputdate의 최신날짜의것을 가져와야 한다. 업데이트의 속성상 항상 같은 이름으로 파일이 저장될것이기 때문이다.

    3. MDB는 일종의 View의 개념을 지원한다. 즉 MDB파일내에 쿼리를 넣고 C#에서는 단지 그 이름만 호출이 가능하다는 것이다. 앞서 예제를 보여주었다. 즉 쿼리는 사실상 mdb에 넣어두는게 변경에 용의할것이다.

    4. 바인딩을 사용하게 된다면 이 소스의 50%는 줄일수 있다.

    게다가 더 효율적이고 기능도 더 많을것이다. 게다가 더 안정적이고 그러지 않은것에 대해서 묻지는 않길 바란다.

    4. 현재는 설명을 위해서 중구난방으로 되어 있다.

    실제적인 활용을 위해서는 각 루틴을 클래스로 만들어야지만 할것이다. 그래서 서버의 소켓 / 클라이언트의 소켓을 따로 분리시키고 이 폼이 아니더라도 다른곳에 붙이기 쉽도록 변경했다.

    디렉토리부분은 구현해 놓지 않았다. 추가는 스스로 할수 있으리라 믿는다.

    전체소스는 MDB를 포함하여

    올려두었다.

    또한 입력하는 사람을 위하여 클래스별로 올려놓았다. 이미지가 작게 나오는건 데브를 탓하기 바란다.

    5. 파일전송에 대한 포스팅은 시간이 되는데로 새로운 프로젝트로 새로운 강좌에서 시작해 보자.

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

자동업그레이드 10  (0) 2008.12.02
자동업그레이드 9  (0) 2008.12.02
자동업그레이드 8  (0) 2008.12.02
자동업그레이드 6  (0) 2008.12.02
자동업그레이드 5  (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 삶의여유로움
:
C# 자동업그레이드 2008. 12. 2. 01:20

    그냥 코딩만 나열하면 될텐데 정말.. 말이 많다.

    하여간.. 계속 진도를 나가자.

    접속을 하면 Ready를 받고 앞에 4byte에 다가는 뒤에 들어갈 녀석의 사이즈를 담아서 보내자

    물론.. 이건 일반적이고 우리는 참 무식하게 해보자. 이번에는 스트링을 가지고 해보자.

    좀 황당하긴 해도 재미있지 않겠는가?

    통신의 규칙은 스스로 만드는것이란걸 보여주고 싶다.

    그럼.. 자 어떻게 해볼까. 10바이트에 내가 보낼 사이즈를 보내준다고 생각해보자.(말도 안되는 이야기 이긴하다)

    예를 들어서 내가 보낼 사이즈가 56789 란 사이즈라면.. 0000056789 라고 보내줘야 될것이다.

    그러기 위해서 PadLeft를 사용해서 빈곳에 0을 채워주겠다.

    (이런방식은 실제적인 통신프로그램에서 사용되지 않는다고 확신한다. 매우 비효율적인듯 싶다.)

    앞서 이야기 했듯이 버퍼에 정보가 들어가는 입장이므로 사이즈를 받고 공간을 마련해서 뒷쪽의 정보를 받는 찰라의 순간에 데이터가 날러갈지 잘못될지 걱정하지 마라.

    자.. 사이즈를 보내고 바로 정보를 보내면 된다.

    clip_image001

    여지없이 잘 온다. 사이즈는 1555라는 이야기고 이제 서버와 클라이언트의 소스를 보자.

    앞서 시리얼 라이징은 지겹게 했으니 잘 알것이다.

    clip_image002

    클라이언트에서 보내는 코드이다.

    MemoryStrem에 개체를 넣고 바이트로 넘겨줬다.

    그럼 그것을 받는 서버는

    clip_image003

    간단하다. 이런 간단루틴만으로 우리는 실제적인 dictionary에 있는 각종정보

    예를 들어서

    아이디 / 패스워드 / 기준날짜 등등..을 아주 손쉽게 전송할수 있게되는것이다.

    자 이정도 했다면 이제 우리는 앞서 우리가 정의했던 기본적인것의 처리를 한듯 싶다. 이제 이 정보를 가지고 로그인에 대한 설정은 스스로 하기로 하고 난 무조건 ok라고 생각하기로 하고

    클라이언트에게 정보를 보내야 하는것이다.

    4byte를 기준으로 good이라고 보내면 그 뒤로 기준데이타를 가지고 업데이트할 정보를 보내주고 fail 이라고 보내면 클라이언트는 업데이트할것이 없다고 생각하고 종료를 하자.

    위와 동일한 수순을 처리하면..

    clip_image004

    손쉽게 클라이언트에서 서버에서 제공하는 데이타셋을 받아온것을 볼 수 있다.

    뒤에 filedata라는 바이너리까지 정상적으로 받아온다.

    앞서 적은것은 일단 이론적인것을 설명하기 위한것이니 기본적 참고만 하고

    이제 전체 소스를 적어보도록 하자.

    일단은

    clip_image005

    이 함수들은 클라이언트에도 그리고 서버에도 있는 공통함수로서 TCP의 버퍼에 있는정보를

    가져오는 함수이다.

    이걸 제외한 클래스를 보자.

    먼저 서버는

    clip_image006

    EachByClass는 접속자마다 인스턴스가 생기는것으로

    접속자마다의 쓰레드가 도는상태내에서 통신의 핸드쉐이킹(?)적인 형태의 신호를 주고 받고 그런다음 클라이언트에서 주는 정보를 기준으로 쿼리를 날려서 이 데이타셋을 클라이언트에게 전송해준다.

    clip_image007

    다수의 클라이언트가 접속했다는 가정내에서 테스트 해본 화면이다.

    클라이언트의 경우는..

    clip_image008

    이런 형태의 모습을 지닌다.

    자 이제는.. 마지막으로 DS 를 가지고 하드에 저장만 하면 된다.. ^^ 별 어려울게 없을듯 싶다.

    아 프로그래스바? 그거야 쉽지 않는가.

    조금 융통성 있게 구성해도 좋지만.. 귀차니즘으로 쉽게 하자면

    clip_image009

    이렇게 두줄만.. 적어주면.. 된다.

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

자동업그레이드 10  (0) 2008.12.02
자동업그레이드 9  (0) 2008.12.02
자동업그레이드 8  (0) 2008.12.02
자동업그레이드 7  (0) 2008.12.02
자동업그레이드 5  (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 삶의여유로움
:
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 삶의여유로움
: