Q&A

  • 소켓과 관련된 질문입니다....
//////////////////////////////////////////////////////////////////////////////

// 아래는 소켓과 관련하여 한델 Q/A를 참고하여

// 간단히 만들어본 함수들입니다.

// 아래부분으로 내려가시다보면 질문이있습니다.

//////////////////////////////////////////////////////////////////////////////



unit uXSocket;



interface



uses

windows, messages, sysutils, classes, scktcomp, Dialogs, stdctrls, controls;



const

mtText = $FF00000000000000; // 텍스트

mtData = $FF00000000000001; // 데이타

mtDataEnd = $FF00000000000002; // 데이타전송완료시

mtTransNM = $FF00000000000003; // 전송시파일명





ctText = 'FF00000000000000';

ctData = 'FF00000000000001'; // 데이타

ctDataEnd = 'FF00000000000002'; // 데이타전송완료시

ctTransNM = 'FF00000000000003'; // 전송시파일명

mtLens = 4096;



type

Pekit = record

msgtp : String[16];

dat: array[0..mtLens-1] of char;

end;



Function FrontToBack(vValue: String): String;

Function RPos(Const vSubStr: String; Const vValue: String): Integer;

Function GetMemoLine(memo:TCustomMemo): Integer;

Function GetMemoCol(memo:TCustomMemo): Integer;

Function Memo2Str(sList: TCustomMemo; itemi: Integer): String;

Procedure AddStr(var Vvalue: String; vStr:Array of String);

Function Strings2Str(sList: TStrings; itemi: Integer): String;

function Int2Hex(nFmt: Integer): String;

Function Int642Hex(nFmt: Int64): String;

Function SendData(clSocket: TCustomWinSocket; theData: String; nFmt: int64=mtText): Boolean; overload;

Function SendData(clSocket: TCustomWinSocket; theData: pChar; nFmt: int64): Boolean; overload;

Procedure GetReceiveFile(ssdata : Pekit);

Procedure SetTransMittFile(clSocket: TCustomWinSocket; sPathFile: String);



var

DownLoadFile: Integer;

defaultDownFolder: String;



implementation



Function FrontToBack(vValue: String): String;

var

iz, mLen: Integer;

Begin

mLen := Length(vValue);

SetLength(Result, mLen);

For iz := mLen downto 1 do Result[iz] := vValue[mLen+1-iz];

End;



// 아직완벽하지 않은 루틴임...

Function RPos(Const vSubStr: String; Const vValue: String): Integer;

Begin

Result := pos(vSubStr, FrontToBack(vValue));

if Result > 0 Then Result := Length(vValue)+1-Result;

End;



Function GetMemoLine(memo:TCustomMemo): Integer;

var

LineNum:LongInt;

begin

LineNum:=SendMessage(Memo.Handle, EM_LINEFROMCHAR, Memo.SelStart, 0);

Result := LineNum+1;

end;



Function GetMemoCol(memo:TCustomMemo): Integer;

var

LineNum, CharseBeforeLine:LongInt;

begin

LineNum:=SendMessage(Memo.Handle, EM_LINEFROMCHAR, Memo.SelStart, 0);

CharseBeforeLine := SendMessage(Memo.Handle, EM_LINEINDEX, LineNum, 0);

Result := Memo.SelStart - CharseBeforeLine + 1;

end;



////////////////////////////////

// 32bit 정수형을 16진수 문자열로 치환하는 루틴

Function Int2Hex(nFmt: Integer): String;

var

z: Integer;

u, uh, ul: Byte;

Begin

result := '';

for z := 3 downto 0 do Begin

u := (nFmt shr (z * 8)) and $FF;

uh := (u shr 4) and $F;

ul := u and $F;

if uh >= 10 Then result := Result + Chr(Byte('A')+uh-10)

else result := Result + Chr(Byte('0')+uh);

if ul >= 10 Then result := Result + Chr(Byte('A')+ul-10)

else result := Result + Chr(Byte('0')+ul);

End;

End;



////////////////////////////////

// 64bit 정수형을 16진수 문자열로 치환하는 루틴

Function Int642Hex(nFmt: Int64): String;

var

z: Integer;

u, uh, ul: Byte;

Begin

result := '';

for z := 7 downto 0 do Begin

u := (nFmt shr (z * 8)) and $FF;

uh := (u shr 4) and $F;

ul := u and $F;

if uh >= 10 Then result := Result + Chr(Byte('A')+uh-10)

else result := Result + Chr(Byte('0')+uh);

if ul >= 10 Then result := Result + Chr(Byte('A')+ul-10)

else result := Result + Chr(Byte('0')+ul);

End;

End;



Procedure AddStr(var Vvalue: String; vStr:Array of String);

var

i : Integer;

Begin

For i := Low(vStr) to High(vStr) do Vvalue := VValue + vStr[i];

End;



Function Strings2Str(sList: TStrings; itemi: Integer): String;

var

iz: Integer;

Begin

for iz := itemi to sList.Count-1 do AddStr(Result, [sList.Strings[iz]]);

End;



Function Memo2Str(sList: TCustomMemo; itemi: Integer): String;

var

iz, iu: Integer;

Begin

iu := 0;

if itemi < 0 Then iu := GetMemoLine(sList)

else if itemi >= 0 Then iu := itemi;

for iz := iu to sList.Lines.Count-1 do AddStr(Result, [sList.Lines.Strings[iz]]);

End;



///////////////////////////////////////////////////////////////////////////

//

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

var

lvs : TMemoryStream;

p : Pekit;

Begin

lvs := TMemoryStream.Create;

Zeromemory(@p,sizeof(pekit));

p.msgtp := int642Hex(nFmt);

strpcopy(@p.dat, theData);

lvs.Write(p, sizeof(p));

lvs.Position := 0;

Result := clSocket.Sendstream(lvs); // 작업이 끝나면 자동으로 Free되는 것 같음....

end;



Function SendData(clSocket: TCustomWinSocket; theData: pChar; nFmt: int64): Boolean;

var

lvs : TMemoryStream;

p : Pekit;

Begin

lvs := TMemoryStream.Create;

Zeromemory(@p,sizeof(pekit));

p.msgtp := int642Hex(nFmt);

strcopy(@p.dat, theData);

lvs.Write(p, sizeof(p));

lvs.Position := 0;

Result := clSocket.Sendstream(lvs); // 작업이 끝나면 자동으로 Free되는 것 같음....

end;



Procedure GetReceiveFile(ssdata : Pekit);

var

pathandFile: String;

Begin

if ssdata.msgtp = ctTransNM Then Begin

pathandFile := defaultDownFolder + strpas(ssdata.dat);

DownLoadFile := FileCreate(pathandFile);

if DownLoadFile <> -1 Then FileSeek(DownLoadFile, 0, 0);

end

else if ssdata.msgtp = ctData Then Begin

if DownLoadFile = -1 Then Exit;

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

End

else if ssdata.msgtp = ctDataEnd Then Begin

if DownLoadFile = -1 Then Exit;

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

FileClose(DownLoadFile);

End;

End;



/////////////////////////////////////////////////////////////////////////////////

// 이곳이 질문의요지인데요.....

// 특정 단축키를 누를때 이 프로시져를 호출하고요

// 받는 부분은 GetReceiveFile(ssdata : Pekit) 평션을 이용하여 받습니다.

// 아래소켓이벤트에서 호출하는 식으로요....

// 일단 파일의 전송여부를 파악하기 위하여 보낼때는 파일을 읽어서

// 읽어진 버퍼의 내용을 보내는거죠 일정시간 지나고

// 다시 보내는 식으로요...

// 일단 문자열은 잘전송되고요 아래 전송루틴도 돌아가는것 같은데요....

// 일단 전송되어진 파일의 크기가 일단 크고 그 안에 내용도 부분적으로

// 잘 이상한 자료가 들어가는것 같습니다....

// 글구 파일전송루틴만 콜하면 다돌고나서 에러가 나는것 같구요

// 프로그램 종료시에 에러가 남니다...

////////////////////////////////////////////////////////////////////////////////

//procedure TChatForm.ClientSocketRead(Sender: TObject;

// Socket: TCustomWinSocket);

//var

// ssdata:Pekit;

//begin

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

// if ssdata.msgtp = ctText Then Begin

// Memo2.Lines.Add(strpas(ssdata.dat));

// End

// else if (ssdata.msgtp = ctData) or (ssdata.msgtp = ctDataEnd)

// or (ssdata.msgtp = ctTransNm) Then Begin

// GetReceiveFile(ssdata);

// Memo2.Lines.Add('파일전송중입니다.');

// End;

//end;



//procedure TChatForm.ServerSocketClientRead(Sender: TObject;

// Socket: TCustomWinSocket);

//var

// ssdata:Pekit;

//begin

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

// if ssdata.msgtp = ctText Then Begin

// Memo2.Lines.Add(strpas(ssdata.dat));

// End

// else if (ssdata.msgtp = ctData) or (ssdata.msgtp = ctDataEnd)

// or (ssdata.msgtp = ctTransNm) Then Begin

// GetReceiveFile(ssdata);

// End;

//end;

/////////////////////////////////////////////////////////////////////////////////

Procedure SetTransMittFile(clSocket: TCustomWinSocket; sPathFile: String);

var

ssdata: pekit;

nread: Integer;

ssFileName: String;

Begin

nread := RPos('', sPathFile);

ssFileName := Copy(sPathFile, Length(sPathFile)-nread, Length(sPathFile)-nread);

SendData(clSocket, ssFileName, mtTransNM);

DownLoadFile := FileOpen(sPathFile, fmOpenread or fmShareDenyNone);

if DownLoadFile = -1 Then Exit;

while true do Begin

nread := FileRead(DownLoadFile, ssdata.dat, sizeof(ssdata.dat));

if nread < mtLens Then Begin

SendData(clSocket, @ssdata.dat, mtDataEnd);

FileClose(DownLoadFile);

Exit;

End else SendData(clSocket, @ssdata.dat, mtData);

Sleep(300);

End;

End;



initialization

defaultDownFolder := 'C:';

finalization

end.



////////////////////////////////////////////////////////////////////////////////

// 소켓과 관련하여 고수님들의 답변을 고대합니다.

// 일단 위부분이 어디에 문제가 있는거지 궁금합니다.



5  COMMENTS
  • Profile
    윤유섭 2000.08.14 06:39
    잘은 모르지만 델파이의 소켓으로 사이즈가 큰 파일을 보내면 정상적으로 전송이

    안된다고 알고 있습니다.



    그래서 인위적으로 특정 크기만큰씩 잘라서 보낸다고 해요..



    저도 테스트 해봤는데 역시 그렇더라구요...



    도움이 되실련지...



    김하늘 wrote:

    > //////////////////////////////////////////////////////////////////////////////

    > // 아래는 소켓과 관련하여 한델 Q/A를 참고하여

    > // 간단히 만들어본 함수들입니다.

    > // 아래부분으로 내려가시다보면 질문이있습니다.

    > //////////////////////////////////////////////////////////////////////////////

    >

    > unit uXSocket;

    >

    > interface

    >

    > uses

    > windows, messages, sysutils, classes, scktcomp, Dialogs, stdctrls, controls;

    >

    > const

    > mtText = $FF00000000000000; // 텍스트

    > mtData = $FF00000000000001; // 데이타

    > mtDataEnd = $FF00000000000002; // 데이타전송완료시

    > mtTransNM = $FF00000000000003; // 전송시파일명

    >

    >

    > ctText = 'FF00000000000000';

    > ctData = 'FF00000000000001'; // 데이타

    > ctDataEnd = 'FF00000000000002'; // 데이타전송완료시

    > ctTransNM = 'FF00000000000003'; // 전송시파일명

    > mtLens = 4096;

    >

    > type

    > Pekit = record

    > msgtp : String[16];

    > dat: array[0..mtLens-1] of char;

    > end;

    >

    > Function FrontToBack(vValue: String): String;

    > Function RPos(Const vSubStr: String; Const vValue: String): Integer;

    > Function GetMemoLine(memo:TCustomMemo): Integer;

    > Function GetMemoCol(memo:TCustomMemo): Integer;

    > Function Memo2Str(sList: TCustomMemo; itemi: Integer): String;

    > Procedure AddStr(var Vvalue: String; vStr:Array of String);

    > Function Strings2Str(sList: TStrings; itemi: Integer): String;

    > function Int2Hex(nFmt: Integer): String;

    > Function Int642Hex(nFmt: Int64): String;

    > Function SendData(clSocket: TCustomWinSocket; theData: String; nFmt: int64=mtText): Boolean; overload;

    > Function SendData(clSocket: TCustomWinSocket; theData: pChar; nFmt: int64): Boolean; overload;

    > Procedure GetReceiveFile(ssdata : Pekit);

    > Procedure SetTransMittFile(clSocket: TCustomWinSocket; sPathFile: String);

    >

    > var

    > DownLoadFile: Integer;

    > defaultDownFolder: String;

    >

    > implementation

    >

    > Function FrontToBack(vValue: String): String;

    > var

    > iz, mLen: Integer;

    > Begin

    > mLen := Length(vValue);

    > SetLength(Result, mLen);

    > For iz := mLen downto 1 do Result[iz] := vValue[mLen+1-iz];

    > End;

    >

    > // 아직완벽하지 않은 루틴임...

    > Function RPos(Const vSubStr: String; Const vValue: String): Integer;

    > Begin

    > Result := pos(vSubStr, FrontToBack(vValue));

    > if Result > 0 Then Result := Length(vValue)+1-Result;

    > End;

    >

    > Function GetMemoLine(memo:TCustomMemo): Integer;

    > var

    > LineNum:LongInt;

    > begin

    > LineNum:=SendMessage(Memo.Handle, EM_LINEFROMCHAR, Memo.SelStart, 0);

    > Result := LineNum+1;

    > end;

    >

    > Function GetMemoCol(memo:TCustomMemo): Integer;

    > var

    > LineNum, CharseBeforeLine:LongInt;

    > begin

    > LineNum:=SendMessage(Memo.Handle, EM_LINEFROMCHAR, Memo.SelStart, 0);

    > CharseBeforeLine := SendMessage(Memo.Handle, EM_LINEINDEX, LineNum, 0);

    > Result := Memo.SelStart - CharseBeforeLine + 1;

    > end;

    >

    > ////////////////////////////////

    > // 32bit 정수형을 16진수 문자열로 치환하는 루틴

    > Function Int2Hex(nFmt: Integer): String;

    > var

    > z: Integer;

    > u, uh, ul: Byte;

    > Begin

    > result := '';

    > for z := 3 downto 0 do Begin

    > u := (nFmt shr (z * 8)) and $FF;

    > uh := (u shr 4) and $F;

    > ul := u and $F;

    > if uh >= 10 Then result := Result + Chr(Byte('A')+uh-10)

    > else result := Result + Chr(Byte('0')+uh);

    > if ul >= 10 Then result := Result + Chr(Byte('A')+ul-10)

    > else result := Result + Chr(Byte('0')+ul);

    > End;

    > End;

    >

    > ////////////////////////////////

    > // 64bit 정수형을 16진수 문자열로 치환하는 루틴

    > Function Int642Hex(nFmt: Int64): String;

    > var

    > z: Integer;

    > u, uh, ul: Byte;

    > Begin

    > result := '';

    > for z := 7 downto 0 do Begin

    > u := (nFmt shr (z * 8)) and $FF;

    > uh := (u shr 4) and $F;

    > ul := u and $F;

    > if uh >= 10 Then result := Result + Chr(Byte('A')+uh-10)

    > else result := Result + Chr(Byte('0')+uh);

    > if ul >= 10 Then result := Result + Chr(Byte('A')+ul-10)

    > else result := Result + Chr(Byte('0')+ul);

    > End;

    > End;

    >

    > Procedure AddStr(var Vvalue: String; vStr:Array of String);

    > var

    > i : Integer;

    > Begin

    > For i := Low(vStr) to High(vStr) do Vvalue := VValue + vStr[i];

    > End;

    >

    > Function Strings2Str(sList: TStrings; itemi: Integer): String;

    > var

    > iz: Integer;

    > Begin

    > for iz := itemi to sList.Count-1 do AddStr(Result, [sList.Strings[iz]]);

    > End;

    >

    > Function Memo2Str(sList: TCustomMemo; itemi: Integer): String;

    > var

    > iz, iu: Integer;

    > Begin

    > iu := 0;

    > if itemi < 0 Then iu := GetMemoLine(sList)

    > else if itemi >= 0 Then iu := itemi;

    > for iz := iu to sList.Lines.Count-1 do AddStr(Result, [sList.Lines.Strings[iz]]);

    > End;

    >

    > ///////////////////////////////////////////////////////////////////////////

    > //

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

    > var

    > lvs : TMemoryStream;

    > p : Pekit;

    > Begin

    > lvs := TMemoryStream.Create;

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

    > p.msgtp := int642Hex(nFmt);

    > strpcopy(@p.dat, theData);

    > lvs.Write(p, sizeof(p));

    > lvs.Position := 0;

    > Result := clSocket.Sendstream(lvs); // 작업이 끝나면 자동으로 Free되는 것 같음....

    > end;

    >

    > Function SendData(clSocket: TCustomWinSocket; theData: pChar; nFmt: int64): Boolean;

    > var

    > lvs : TMemoryStream;

    > p : Pekit;

    > Begin

    > lvs := TMemoryStream.Create;

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

    > p.msgtp := int642Hex(nFmt);

    > strcopy(@p.dat, theData);

    > lvs.Write(p, sizeof(p));

    > lvs.Position := 0;

    > Result := clSocket.Sendstream(lvs); // 작업이 끝나면 자동으로 Free되는 것 같음....

    > end;

    >

    > Procedure GetReceiveFile(ssdata : Pekit);

    > var

    > pathandFile: String;

    > Begin

    > if ssdata.msgtp = ctTransNM Then Begin

    > pathandFile := defaultDownFolder + strpas(ssdata.dat);

    > DownLoadFile := FileCreate(pathandFile);

    > if DownLoadFile <> -1 Then FileSeek(DownLoadFile, 0, 0);

    > end

    > else if ssdata.msgtp = ctData Then Begin

    > if DownLoadFile = -1 Then Exit;

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

    > End

    > else if ssdata.msgtp = ctDataEnd Then Begin

    > if DownLoadFile = -1 Then Exit;

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

    > FileClose(DownLoadFile);

    > End;

    > End;

    >

    > /////////////////////////////////////////////////////////////////////////////////

    > // 이곳이 질문의요지인데요.....

    > // 특정 단축키를 누를때 이 프로시져를 호출하고요

    > // 받는 부분은 GetReceiveFile(ssdata : Pekit) 평션을 이용하여 받습니다.

    > // 아래소켓이벤트에서 호출하는 식으로요....

    > // 일단 파일의 전송여부를 파악하기 위하여 보낼때는 파일을 읽어서

    > // 읽어진 버퍼의 내용을 보내는거죠 일정시간 지나고

    > // 다시 보내는 식으로요...

    > // 일단 문자열은 잘전송되고요 아래 전송루틴도 돌아가는것 같은데요....

    > // 일단 전송되어진 파일의 크기가 일단 크고 그 안에 내용도 부분적으로

    > // 잘 이상한 자료가 들어가는것 같습니다....

    > // 글구 파일전송루틴만 콜하면 다돌고나서 에러가 나는것 같구요

    > // 프로그램 종료시에 에러가 남니다...

    > ////////////////////////////////////////////////////////////////////////////////

    > //procedure TChatForm.ClientSocketRead(Sender: TObject;

    > // Socket: TCustomWinSocket);

    > //var

    > // ssdata:Pekit;

    > //begin

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

    > // if ssdata.msgtp = ctText Then Begin

    > // Memo2.Lines.Add(strpas(ssdata.dat));

    > // End

    > // else if (ssdata.msgtp = ctData) or (ssdata.msgtp = ctDataEnd)

    > // or (ssdata.msgtp = ctTransNm) Then Begin

    > // GetReceiveFile(ssdata);

    > // Memo2.Lines.Add('파일전송중입니다.');

    > // End;

    > //end;

    >

    > //procedure TChatForm.ServerSocketClientRead(Sender: TObject;

    > // Socket: TCustomWinSocket);

    > //var

    > // ssdata:Pekit;

    > //begin

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

    > // if ssdata.msgtp = ctText Then Begin

    > // Memo2.Lines.Add(strpas(ssdata.dat));

    > // End

    > // else if (ssdata.msgtp = ctData) or (ssdata.msgtp = ctDataEnd)

    > // or (ssdata.msgtp = ctTransNm) Then Begin

    > // GetReceiveFile(ssdata);

    > // End;

    > //end;

    > /////////////////////////////////////////////////////////////////////////////////

    > Procedure SetTransMittFile(clSocket: TCustomWinSocket; sPathFile: String);

    > var

    > ssdata: pekit;

    > nread: Integer;

    > ssFileName: String;

    > Begin

    > nread := RPos('', sPathFile);

    > ssFileName := Copy(sPathFile, Length(sPathFile)-nread, Length(sPathFile)-nread);

    > SendData(clSocket, ssFileName, mtTransNM);

    > DownLoadFile := FileOpen(sPathFile, fmOpenread or fmShareDenyNone);

    > if DownLoadFile = -1 Then Exit;

    > while true do Begin

    > nread := FileRead(DownLoadFile, ssdata.dat, sizeof(ssdata.dat));

    > if nread < mtLens Then Begin

    > SendData(clSocket, @ssdata.dat, mtDataEnd);

    > FileClose(DownLoadFile);

    > Exit;

    > End else SendData(clSocket, @ssdata.dat, mtData);

    > Sleep(300);

    > End;

    > End;

    >

    > initialization

    > defaultDownFolder := 'C:';

    > finalization

    > end.

    >

    > ////////////////////////////////////////////////////////////////////////////////

    > // 소켓과 관련하여 고수님들의 답변을 고대합니다.

    > // 일단 위부분이 어디에 문제가 있는거지 궁금합니다.

    >

  • Profile
    김하늘 2000.08.14 18:21
    > 윤유섭 wrote:

    > 잘은 모르지만 델파이의 소켓으로 사이즈가 큰 파일을 보내면 정상적으로 전송이

    > 안된다고 알고 있습니다.

    >

    > 그래서 인위적으로 특정 크기만큰씩 잘라서 보낸다고 해요..

    >

    > 저도 테스트 해봤는데 역시 그렇더라구요...

    >

    > 도움이 되실련지...



    김하늘 wrote:

    위의 소스에서 알수 있듯이 특정크기만큼 잘라서 보냅니다.

    위의 상수 mtLens 길이 + 패킷16자리만큼요....

    보낼때는 처음엔 패킷과 + 파일명을 보내고

    파일의 마지막전까지 패킷과 + 4096만큼읽어서 보내고

    마지막에는 마지막을 암시하는 패킷과 + 마지막으로 읽은 내용을 보냅니다.

    자르는 단위는 얼마면 적당한지요....

    관련된 소스나 참고할 만한 자료가 없는지요....





  • Profile
    윤유섭 2000.08.15 01:09
    잘 모르면서 자꾸 글을 올리게 되네요.



    이 게시판에서 Packet이나 Socket으로 검색하면 많은 자료들을 볼 수 있습니다.



    Packet단위로의 적당한 크기는 저두 잘 모르고요...



    게시판 검색하다보니 아래와 같은 자료가 있었어요.



    참고하시길...



    병이기 wrote:

    > 델파이의 소켓으로 파일전송을 할수 있다고 들었습니다.

    > 어떻게 전송을 하는지.. 간단한 예제라도....

    > 암튼 부탁드립니다... 꼭이요...



    저도 여기에서 많은 정보를 얻고 있으니..

    이기회에 저도 보답을 해야겠네요..(^__^)



    저 같은 경우에는 파일 송/수신을 Tserversocket/TClientSocket으로

    해결했습니다...



    송신측에서는 수신측의 socket에 접속하여

    1024byte단위로 파일을 읽어서 sendtext메소드로 자료를

    전송하고 수신측에서는 받은 데이타의 크기만큼

    다시 송신측으로 ACK신호를 보내고

    다시 송신측에서는 다음 packet을 보내고..



    이런 식으로 구현하시면..

    간단하게 해결될겁니다..



    여기서 중요한것은 반드시 Tserversocket과 TclientSocket의

    전송되는 자료에 대한 Handshaking이 필요하다는 겁니다..

    제가 테스트를 해본결과로는 무작정

    자료를 보내기만 하면..

    받는 쪽에서 packet loss가 생길수가 있더군요....

    이유는 주로 받는 시스템에서의 socket buffer Full이였던것 같습니다...



    지금 이와 관련하여..컴포넌트를 만들고 있는 중이고요..

    파일 송/수신 처리는 깔끔하게 해결은 되었지만..

    제가 컴포넌트 제작에 관련한 지식이 짧아서...

    다소 지연이 되고 있는중입니다...

    이거 완성되는데로 자료실에 올려 놓겠습니다......



    거의 2일을 헤맸습니다...

    저도....



    그리고 혹시 이글을 읽으시는분중에...

    컴포넌트 제작에 지식이 있으신분 계시면...

    제게 도움을 좀 주십시요..



    델파이언도 리눅스의 GNU정신처럼.....

    서로의 지식을 공유하는것도 괜챦을것 같은데..

    그래야지 한국 소프트웨어 시장의 발전을 더욱더 꽤할 수 있을것 같은데..



    누구던지..약간의 컴포넌트를 만들기만 하면...

    바로 shareware로 만들어 버리니....

    이런점이 참..아쉽네요....

    이상 델파이 초보의 넉두리였습니다.....

  • Profile
    델초 2000.08.16 03:46
    안녕하세요. 델초입니당..

    컴포넌트 제작에 도움이 되셨으면 하고,, 추천합니당.. acro edit 를

    만드신분의 홈페이지입니다. 거기에 컴포넌트 제작 강좌가 있는데, 아주

    훌륭합니다.. arcrosoft.pe.kr입니다. .그럼..이만,



    윤유섭 wrote:

    > 잘 모르면서 자꾸 글을 올리게 되네요.

    >

    > 이 게시판에서 Packet이나 Socket으로 검색하면 많은 자료들을 볼 수 있습니다.

    >

    > Packet단위로의 적당한 크기는 저두 잘 모르고요...

    >

    > 게시판 검색하다보니 아래와 같은 자료가 있었어요.

    >

    > 참고하시길...

    >

    > 병이기 wrote:

    > > 델파이의 소켓으로 파일전송을 할수 있다고 들었습니다.

    > > 어떻게 전송을 하는지.. 간단한 예제라도....

    > > 암튼 부탁드립니다... 꼭이요...

    >

    > 저도 여기에서 많은 정보를 얻고 있으니..

    > 이기회에 저도 보답을 해야겠네요..(^__^)

    >

    > 저 같은 경우에는 파일 송/수신을 Tserversocket/TClientSocket으로

    > 해결했습니다...

    >

    > 송신측에서는 수신측의 socket에 접속하여

    > 1024byte단위로 파일을 읽어서 sendtext메소드로 자료를

    > 전송하고 수신측에서는 받은 데이타의 크기만큼

    > 다시 송신측으로 ACK신호를 보내고

    > 다시 송신측에서는 다음 packet을 보내고..

    >

    > 이런 식으로 구현하시면..

    > 간단하게 해결될겁니다..

    >

    > 여기서 중요한것은 반드시 Tserversocket과 TclientSocket의

    > 전송되는 자료에 대한 Handshaking이 필요하다는 겁니다..

    > 제가 테스트를 해본결과로는 무작정

    > 자료를 보내기만 하면..

    > 받는 쪽에서 packet loss가 생길수가 있더군요....

    > 이유는 주로 받는 시스템에서의 socket buffer Full이였던것 같습니다...

    >

    > 지금 이와 관련하여..컴포넌트를 만들고 있는 중이고요..

    > 파일 송/수신 처리는 깔끔하게 해결은 되었지만..

    > 제가 컴포넌트 제작에 관련한 지식이 짧아서...

    > 다소 지연이 되고 있는중입니다...

    > 이거 완성되는데로 자료실에 올려 놓겠습니다......

    >

    > 거의 2일을 헤맸습니다...

    > 저도....

    >

    > 그리고 혹시 이글을 읽으시는분중에...

    > 컴포넌트 제작에 지식이 있으신분 계시면...

    > 제게 도움을 좀 주십시요..

    >

    > 델파이언도 리눅스의 GNU정신처럼.....

    > 서로의 지식을 공유하는것도 괜챦을것 같은데..

    > 그래야지 한국 소프트웨어 시장의 발전을 더욱더 꽤할 수 있을것 같은데..

    >

    > 누구던지..약간의 컴포넌트를 만들기만 하면...

    > 바로 shareware로 만들어 버리니....

    > 이런점이 참..아쉽네요....

    > 이상 델파이 초보의 넉두리였습니다.....





  • Profile
    김하늘 2000.08.15 03:15
    답변 주신것 감사 드립니다...



    덧붙여 질문 드립니다...

    소스를 참고하시면

    송신측 16자리패킷+데이타(1024)

    이렇게 보낼때

    받는쪽은 16자리패킷+데이타(1024)

    으로 날라오길 기대합니다.



    이런식으로 날아오지 않는다는 의미인가요?

    패킷과데이타순서에 입각하여

    날라오지 않는건가요?

    즉 수신측에서 받을때 16자리패킷 + 데이타가 안날라온다는 의미인지요?