|
안녕하세요
소켓으로 파일 전송하고자 합니다.
(참고할수 있는 자료나 책같은것이라도 소개 좀 부탁드립니다.)
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나 다른 컴포넌트를 이용할수 없습니다.
|