[C#] 파일 다운로드 시스템 - 클라이언트 통신 모듈

개발 노트/C#  2013.03.01 09:00

안녕하세요 명월입니다.

 

이번 포스팅에서는 클라이언트에서의 통신 모듈을 알아보겠습니다.

 

 

역시 클라이언트 시작 버튼을 누르면 클라이언트 스레드가 시작됩니다.

 

 

소스를 확인 해 보면 접속 ip는 127.0.01 로써 로컬에 접속하겠습니다.

똑같이 서버와 똑같이 Protocal 부분이 있고 DataReceive 함수가 호출 되겠습니다.

 

 

서버 프로토콜과 비교해서는 반대 형식입니다.

서버 같은 경우는 Send 후 Receive 를 한 반면 클라이언트는 Receive 후 Send를 합니다.

즉 서버가 클라이한테 SockStart 전문을 보내면 클라이언트는 서버에게 ok 라고 응신을 하는 형식입니다.

 

이런 것이 프로토콜입니다. 통신 규약이라고 하지요. 이건 제가 만든 프로토콜이라 조금 허술 하지만 패킷을 주고 받는 모든 통신에는 이런 프로토콜 통신 규약이 있습니다.

웹도 있고 FTP도 있고..

 

다시 소스로 돌아와서 프로토콜 부분이 완료가 되면 데이터 수신하겠습니다.

 

 

데이터 수신하는 부분입니다.

처음에는 파일의 갯수를 수신하고 반복문안에 FileReceive 함수를 호출 하겠습니다.

 

 

 

소스를 확인 해보면 위에서 파일 이름, 파일 사이즈 그리고 데이트를 수신 받습니다.

버퍼는 서버에서도 4096 사이즈로 보냈기 때문에 같은 사이즈로 보내는 것입니다.

 

그리고 중간에 보면 파란색 박스 부분이 보입니다.

그 부분의 이유는 단지 버그 해소용입니다. 제가 저 부분 해결하느라 거의 3시간을 투자했습니다. 패킷을 분석해 본 결과 Server에서는 보내지도 않은 패킷을 Client 에서 수신을 하고 있었던 겁니다. 즉 10M 를 보내면 수신측은 11M가 되어 버립니다.

아무리 찾아도 왜 그럴까는 이유를 찾지 못했어요. 그런데 중간에 스트링에 담았다가 Remove  시켜버리면 정상으로 다운로드를 하더라구요..(저걸 알아낸 것도 기적임..ㅎㅎ)

 

혹시라도 이유를 아시는 분은 알려주세요.

 

여기까지 파일 다운로드 시스템 포스팅은 완료가 되었습니다. 질문 사항이 있으면 답글 또는 메일 받겠습니다.

 

 

 

 

 


댓글 2개가 달렸습니다.
댓글쓰기
  1. plaj
    2013.05.02 03:30 신고 |  수정/삭제  댓글쓰기

    안녕하세요 좋은 글 잘봤습니다.

    한가지 궁금한 점이 있어서 글 남겨 봅니다.

    제가 지금 tcp/ip를 이용해 서버와 클라이언트가 데이터를 주고 받고 있는데요.

    서버에서 빠르게 패킷을 7개 정도를 보내면

    클라이언트에서 7개를 다 처리를 못하는 현상이 발생하는데요..

    이 패킷들이 다 어디로 가는거죠..? 유독 마지막패킷은 정확하게 처리가 되네요..

    클라이언트에서 어떤식으로 처리를 해줘야 손실(?)이 안생길 수 있을까요??

    서버에는 문제가 전혀 없습니다..

    • 明月 v명월v
      2013.05.11 11:14 신고 |  수정/삭제

      안녕하세요 블로그 방문 감사합니다.
      데이터들이 어디로 가는게 아니고 데이터 수신을 못한 것입니다.
      정확하게 말하면 수신을 하였지만 프로그램에서 처리를 못한게 맞지요.
      가장 좋은 방법은 서버와 클라이언트간의 가변이 아닌 정확한 데이터 크기를 정해 놓는게 가장 좋습니다.
      즉 하나의 패킷에는 100byte를 보낸다.(스페이스 포함해서) 정해 놓으면 수신측도 그거에 맞게 패킷을 정해 놓습니다.

      그러나 다운로드 시스템 같은 경우는 파일의 크기가 다르기 때문에 송신전에 나 지금 얼마크기의 패킷을 보낸다고 전문을 보내서 수신전의 패킷 사이즈의 크기를 정해 놓습니다.

      그렇게 하면 손실이 없어지겠지요.