Q&A

  • 서버에서 클라이언트로는 파일이 안가요..ㅠ.ㅠ
소켓을 이용해서 서버와 클라이언트를 짜고 있는데요,

클라이언트에서는 파일이 잘가는데.. 서버에서는 안갑니다.

클라이언트에는 클라이언트소켓 컴포넌트를 이용했구. 서버에는 서버 콤퍼넌트를 이용했슴다. 서버에서도 클라이언트에서 서버로 파일전송하는것처럼 똑같이 했는데...

sendbuf하는 순간에 클라이언트와 연결이 끊어지면서 에러가(10057 socket error) 납니다. 왜그러는지 정말 모르겠습니다. 계속해서 질문을 하는데 답변해주시는 분이 없군요.

ㅠ.ㅠ 정말 답답해서 미치겠구만~~ 왜그럴까? 답변좀 해주세요쫌.!!

대충 소스는 아래와 같구요.. 모든 소스를 올리기는 좀 벅차서 ..



<보내는 부분>

procedure TChatForm.SpeedButton2Click(Sender: TObject);

var

F: file;

begin

OpenDialog1.Title := 'Select File';

OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];

OpenDialog1.Filter := 'Text files (*.txt)|*.txt|All files (*.*)|*.*';

OpenDialog1.FilterIndex := 2; { start the dialog showing all files }



if OpenDialog1.Execute then begin

AssignFile(F, OpenDialog1.FileName);

try

Reset(F);

if MessageDlg(' Transefer ' + OpenDialog1.FileName + '?',

mtConfirmation, [mbYes, mbNo], 0) = mrYes then

begin

Senddata(ClientSocket.Socket, OpenDialog1.FileName, mtfile);



CloseFile(F);

end;

except

on EInOutError do

MessageDlg('File transfer error.', mtError, [mbOk], 0);

end;

end;

end;



Function SendData(clSocket: TCustomWinSocket; theData: String; nFmt: int64): Integer;

var

p : Pekit;

Begin

Zeromemory(@p,sizeof(pekit));

p.msgtp := int642Hex(nFmt);

p.buffsize := Length(theData);

strpcopy(p.dat, theData);

p.checksum := CheckSum(p); => 체크섬하는 부분.

Result := clSocket.SendBuf(p, sizeof(Pekit)); =>이곳에서 에러가 남니다.

end;

<받는부분>

procedure TChatForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);



socket.ReceiveBuf(ssdata, sizeof(Pekit));

if (ssdata.msgtp = ctFILE) or (ssdata.msgtp = ctData) or (ssdata.msgtp = ctDataEnd)

or (ssdata.msgtp = ctTransNm) Then Begin

SocketReceive(Socket, ssdata);

end;



Procedure SocketReceive(clSocket: TCustomWinSocket; ssdata : Pekit);

var

pathandFile: String;

Begin

// 파일보낸다라고 보냈을때 그럼 보내라는 패킷을 날린다....

if ssdata.msgtp = ctFILE Then Begin

SendData(clSocket, ssdata, ssdata.buffsize, mtACK0);

Exit;

End;

// 파일명을 보냈다라고 했을때 조치후 잘받았다라는 패킷을 날린다....

if ssdata.msgtp = ctTransNM Then Begin

pathandFile := strpas(ssdata.dat);

chatform.Memo2.Lines.Add(pathandfile + ' sending....');

pathandFile := defaultDownFolder + ExtractFileName(pathandFile);

DnFSize := getFileSize(DownLoadFile, nil);

DownLoadFile := FileCreate(pathandFile);

if DownLoadFile = -1 Then Exit;

FileSeek(DownLoadFile, 0, 0);

SendData(clSocket, ssdata, ssdata.buffsize, mtACK1);

end

else if (ssdata.msgtp = ctData) or

(ssdata.msgtp = ctDataEnd) Then Begin // 데이타를 보냈으니 조치후 잘받았다를 보낸다....

if DownLoadFile = -1 Then Exit; // 데이타의 마지막부분을 받았을 경우는 조치후



FileSeek(DownLoadFile, ssdata.postion, 0); // 파일의 위치지정



FileWrite(DownLoadFile, ssdata.dat, ssdata.buffsize);

if ssdata.msgtp = ctData Then SendData(clSocket, ssdata, ssdata.buffsize, mtACK1)

else if ssdata.msgtp = ctDataEnd Then Begin // 파일송수신은 끝이다라 메시지를 보낸다....

FileClose(DownLoadFile);

SendData(clSocket, ssdata, ssdata.buffsize, mtACK2);

chatform.Memo2.Lines.Add(pathandfile + 'sending succesful!');

showmessage('수신완료');

End;

End;

End;





2  COMMENTS
  • Profile
    승추니 2001.08.04 18:37
    안녕하세요.



    고생하시는 것 같아서 조금이라도 도움이 되기 위해 끄적임다..



    소스가 넘 어려워서(?) 잘 보진 않았지만, 우선 검사하실 부분을 적어보겠슴다.



    연결이 끊어지면서 에러가 발생한다고 하셨는데, 10057은 socket이 연결되지



    않았다는 에러임다. 따라서, 함 sendbuf하기 전에 if로 active = ?? 함 보시져..



    글구.. 제가 잘 이해를 못해서 구럴지도 몰겠지만, "서버에서는 안간다"라는



    말이 "클라이언트->서버"로의 파일전송을 말씀하시는 거져?? 소스에서는 구렇게



    써 있는것 같아서여.. 군데 제목은 반대로 써 있구여.. 함 확인해 보세요..



    쉽게 찾을 수 있을 껌니다..



    구럼 즐푸하세요..



    ----------------------------





    정종섭 wrote:

    > 소켓을 이용해서 서버와 클라이언트를 짜고 있는데요,

    > 클라이언트에서는 파일이 잘가는데.. 서버에서는 안갑니다.

    > 클라이언트에는 클라이언트소켓 컴포넌트를 이용했구. 서버에는 서버 콤퍼넌트를 이용했슴다. 서버에서도 클라이언트에서 서버로 파일전송하는것처럼 똑같이 했는데...

    > sendbuf하는 순간에 클라이언트와 연결이 끊어지면서 에러가(10057 socket error) 납니다. 왜그러는지 정말 모르겠습니다. 계속해서 질문을 하는데 답변해주시는 분이 없군요.

    > ㅠ.ㅠ 정말 답답해서 미치겠구만~~ 왜그럴까? 답변좀 해주세요쫌.!!

    > 대충 소스는 아래와 같구요.. 모든 소스를 올리기는 좀 벅차서 ..

    >

    > <보내는 부분>

    > procedure TChatForm.SpeedButton2Click(Sender: TObject);

    > var

    > F: file;

    > begin

    > OpenDialog1.Title := 'Select File';

    > OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];

    > OpenDialog1.Filter := 'Text files (*.txt)|*.txt|All files (*.*)|*.*';

    > OpenDialog1.FilterIndex := 2; { start the dialog showing all files }

    >

    > if OpenDialog1.Execute then begin

    > AssignFile(F, OpenDialog1.FileName);

    > try

    > Reset(F);

    > if MessageDlg(' Transefer ' + OpenDialog1.FileName + '?',

    > mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    > begin

    > Senddata(ClientSocket.Socket, OpenDialog1.FileName, mtfile);

    >

    > CloseFile(F);

    > end;

    > except

    > on EInOutError do

    > MessageDlg('File transfer error.', mtError, [mbOk], 0);

    > end;

    > end;

    > end;

    >

    > Function SendData(clSocket: TCustomWinSocket; theData: String; nFmt: int64): Integer;

    > var

    > p : Pekit;

    > Begin

    > Zeromemory(@p,sizeof(pekit));

    > p.msgtp := int642Hex(nFmt);

    > p.buffsize := Length(theData);

    > strpcopy(p.dat, theData);

    > p.checksum := CheckSum(p); => 체크섬하는 부분.

    > Result := clSocket.SendBuf(p, sizeof(Pekit)); =>이곳에서 에러가 남니다.

    > end;

    > <받는부분>

    > procedure TChatForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);

    >

    > socket.ReceiveBuf(ssdata, sizeof(Pekit));

    > if (ssdata.msgtp = ctFILE) or (ssdata.msgtp = ctData) or (ssdata.msgtp = ctDataEnd)

    > or (ssdata.msgtp = ctTransNm) Then Begin

    > SocketReceive(Socket, ssdata);

    > end;

    >

    > Procedure SocketReceive(clSocket: TCustomWinSocket; ssdata : Pekit);

    > var

    > pathandFile: String;

    > Begin

    > // 파일보낸다라고 보냈을때 그럼 보내라는 패킷을 날린다....

    > if ssdata.msgtp = ctFILE Then Begin

    > SendData(clSocket, ssdata, ssdata.buffsize, mtACK0);

    > Exit;

    > End;

    > // 파일명을 보냈다라고 했을때 조치후 잘받았다라는 패킷을 날린다....

    > if ssdata.msgtp = ctTransNM Then Begin

    > pathandFile := strpas(ssdata.dat);

    > chatform.Memo2.Lines.Add(pathandfile + ' sending....');

    > pathandFile := defaultDownFolder + ExtractFileName(pathandFile);

    > DnFSize := getFileSize(DownLoadFile, nil);

    > DownLoadFile := FileCreate(pathandFile);

    > if DownLoadFile = -1 Then Exit;

    > FileSeek(DownLoadFile, 0, 0);

    > SendData(clSocket, ssdata, ssdata.buffsize, mtACK1);

    > end

    > else if (ssdata.msgtp = ctData) or

    > (ssdata.msgtp = ctDataEnd) Then Begin // 데이타를 보냈으니 조치후 잘받았다를 보낸다....

    > if DownLoadFile = -1 Then Exit; // 데이타의 마지막부분을 받았을 경우는 조치후

    >

    > FileSeek(DownLoadFile, ssdata.postion, 0); // 파일의 위치지정

    >

    > FileWrite(DownLoadFile, ssdata.dat, ssdata.buffsize);

    > if ssdata.msgtp = ctData Then SendData(clSocket, ssdata, ssdata.buffsize, mtACK1)

    > else if ssdata.msgtp = ctDataEnd Then Begin // 파일송수신은 끝이다라 메시지를 보낸다....

    > FileClose(DownLoadFile);

    > SendData(clSocket, ssdata, ssdata.buffsize, mtACK2);

    > chatform.Memo2.Lines.Add(pathandfile + 'sending succesful!');

    > showmessage('수신완료');

    > End;

    > End;

    > End;

    >

    >

  • Profile
    나그네 2001.08.09 03:44
    클라이언트->서버"로의 파일전송을 말씀하시는 거져?



    저도 묻고 싶네요... 지금 저 소스는 클라이언트에서 -> 서버로 보내는 겁니다.

    서버에서 클라이언트로 보내실려면 좀 바꾸셔야 해요

    혹시 저 소스가지고 서버에서 클라이언트로 보내려고 하시는 건 아니죠?