Q&A

  • indy로 파일 송수신시 마지막 데이터 처리 문제
강좌 와 자료실에 올라온 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를 살펴보다 보니 당체 원인을 알수없서 질문란에 도움을 요청하게 되었습니다. 꼭 좀 해결을 할수 있으면 좋겠습니다.
0  COMMENTS