C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[36935] 소켓으로 파일전송시하는데... 좋은 알고리즘 좀 가르쳐 주세요
장성호 [] 2997 읽음    2004-08-23 16:35
안녕하세요
소켓으로 파일 전송하고자 합니다.
(참고할수 있는 자료나 책같은것이라도 소개 좀 부탁드립니다.)

C++Builder의 TServerSocket과 TClientSocket을 쓰고있습니다.

맨처음 File Name과 File Size를 전송합니다.

그다음 File을 일정한 크기(1024BYte)씩 짤라서  전송합니다.
그런데 가끔 전송중간에 Error가 나는수 있더라구요
그것을 확인하기 위해 Data맨뒤에 CheckSum을 1Byte추가했습니다.
CheckSum은 모든Data를 XOR했구요

Data를 수신한후 CheckSum에 문제가 있으면
해당Packet을 다시 전송해달라고 송신측에 메세지를 보냅니다.

송신측에서는 재전송요청을 받으면
해당Packet의 Data+CheckSum+Packet번호 를 송신합니다.
Packet번호는 2Byte입니다.


즉 일단 file을 모두 전송한후에
저쪽에서 error가 있다는 부분만 다시 전송해주는 구조입니다.

[한번에 전송되는 data구조 1,2,3]
1 - FileName+FileSize              ==> 맨처음에 file에 대한 정보를 전송한다.
2 - Data+CheckSum                 ==> 다음. 일정크기+1Byte =1025Byte 씩 data를 전송합니다.... File끝까지
.
.
3 - Data+CheckSum+Packet번호  ==>마지막으로 일정크기+1Byte+2Byte=1027Byte  error packet을 전송합니다.

전송종료는 data를 모두 전송후에 일정시간(2초)이상 error패킷에 대해 재전송 요청이 없으면
전송을 마무리하구요

수신측에서는 Data를 완벽하게 수신했거나  에러packet이 있을경우 송신측에서 일정시간 전송해주시 않으면
그냥 수신실패한것으로 마무리 합니다.


문제점과 의문나는점은?

1) 재전송요청한 packet에서 계속반복해서 Error가 나는경우가 있구요
2) 처음 file전송시(2번)에는 data에 대한 packet번호를 수신측에서 차례대로 수신한다고 생각하고
    함께 전송하지 않습니다.--> 그래도 되는지...?
3) 송신측에서 전송중에 재전송요청을 받았을때.. 그 부분부터 다시보내는것이 좋을런지...?
4) 보통 메신져(MSN이나 NateOn 같은데)에서는 어떻게 하는지?
5) CheckSum 만드는 더좋은 방법이 있으면 소개좀 부탁드립니다.
6) 마지막을 ZModem처음 전송되는 Packet의 크기를 가변적으로 하려면  어떻게 해야하죠?
    에러가 없으면 점점 전송되는 packet의 크기가 커지는것으로 알고잇는데....  (너무 막연한 질문인가?)

목표
가능한한  최대한 빠르게 파일이 전송 되어야합니다.
그럴러면 전송되는 data에 Header가 적어야겠죠(반드시 그렇지는 않겠지만)
그리고 당연히 수신file에 1Byte라도 error는 없어야겠구요?
마지막으로 수신측에서도 Acknowledge같은것도 최대한 적게 보내야 합니다.
XMODEM이나 YMODEM같은경우는 한번수신할때만다 Acknowledge를 보내는것으로 알고있습니다.(맞나?)

참고로 이 파일전송 부분은 직접구현해야합니다.
FTP나 다른 컴포넌트를 이용할수 없습니다.

+ -

관련 글 리스트
36935 소켓으로 파일전송시하는데... 좋은 알고리즘 좀 가르쳐 주세요 장성호 2997 2004/08/23
36940     빌더 5로 컨버젼 해주시면 안될까요.-인디와 다른점은.. 하안인 1253 2004/08/23
36942         Re: 컨버젼 .. 간단하니까 직접하셔도.. 될듯.. 장성호 1217 2004/08/23
36941         Indy 컴포넌트와 다른점은 무엇인가요 하안인 1319 2004/08/23
36944             Re:Indy 컴포넌트와 다른점은 무엇인가요 이점한 1606 2004/08/23
36945                 감사합니다. 하안인 880 2004/08/24
36937         감사합니다. 그런데.... Packet에 Error라 발생할때는 고려가 되어있지 않네요 장성호 1475 2004/08/23
36943             Re:^^; 이점한 1854 2004/08/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.