소켓을 이용해서 서버와 클라이언트를 짜고 있는데요,
클라이언트에서는 파일이 잘가는데.. 서버에서는 안갑니다.
클라이언트에는 클라이언트소켓 컴포넌트를 이용했구. 서버에는 서버 콤퍼넌트를 이용했슴다. 서버에서도 클라이언트에서 서버로 파일전송하는것처럼 똑같이 했는데...
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;
고생하시는 것 같아서 조금이라도 도움이 되기 위해 끄적임다..
소스가 넘 어려워서(?) 잘 보진 않았지만, 우선 검사하실 부분을 적어보겠슴다.
연결이 끊어지면서 에러가 발생한다고 하셨는데, 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;
>
>