강좌 와 자료실에 올라온 Source를 토대로 indy에 대해 공부해보기 위해
파일을 송수신 하는 indy를 이용하여 Client와 Server를 만들었습니다.
델파이는 6.0 indy는 델파이 6용 indy9.0.17 입니다.
테스트를 해보니 자료실에 올라온 실행파일은 실제 전송을 하여 보면 전송중에 아예 중단이 되고 강좌란에 있는 실행파일은 정상적으로 잘 처리가 됩니다. 두가지 내용을 종합하여 코딩을 하였는데 Client부분에서 문제가 있는 것을 발견했습니다. 전송을 하게 되면 수신된 폴더에는 동일한 파일size로 파일이 생성되어 있으나, 실제 데이터의 마지막부분이 정상적으로 처리가 되지 못하는것 같습니다. 다음은 제가 강좌를 보고 코딩한 부분입니다.
procedure TWriteThread.Execute;
var
RecStr: String;
FStream: TFileStream;
RecvRecord: TransferRecord;
begin
While not Terminated do
try
if not WThreadSock.Connected then
begin
Suspend;
Freeandnil(WTread);
Exit;
end;
WThreadSock.WriteBuffer(send, sizeof(send), true);
WThreadSock.ReadBuffer(RecvRecord, sizeof(RecvRecord));
RecStr := Trim(RecvRecord.msg);
if RecStr = '$_FILE_NO_$' then
begin
if WThreadSock.Connected then WThreadSock.Disconnect;
suspend;
Freeandnil(Wtread);
end
else
if RecStr = '$_FILE_GET_READY_$' then
begin
try
FStream := TFileStream.Create(send.FileName, fmOpenRead or fmShareDenyNone);
if RecvRecord.Append then
begin
try
FStream.Seek(RecvRecord.FileSize, soFromBeginning);
FStream.Position := RecvRecord.FileSize;
if WThreadSock.Connected then WThreadSock.WriteStream(FStream, false, true);
except
end;
end
else
begin
try
FStream.Seek(0, soFromBeginning);
if WThreadSock.Connected then WThreadSock.WriteStream(FStream, true, true);
except
end;
end;
finally
Freeandnil(FStream);
if WThreadSock.Connected then WThreadSock.Disconnect;
end;
end;
except on E: Exception do
begin
if WThreadSock.Connected then WThreadSock.Disconnect;
Terminate;
end;
end;
end;
제 생각에는
FStream.Seek(0, soFromBeginning);
if WThreadSock.Connected then WThreadSock.WriteStream(FStream, true, true);
부분을 처리 하는 과정에서 먼가 보완할 부분이 있을거 같은데 그걸 모르겠습니다.
이어받기 까지는 필요없고 사실 항상 새로 전송해도 되는데 이제 indy를 살펴보다 보니 당체 원인을 알수없서 질문란에 도움을 요청하게 되었습니다. 꼭 좀 해결을 할수 있으면 좋겠습니다.