Q&A

  • [재질문] Receivebuffer로 받은 값을 Record 변수에 저장하는 법?
질문>

제가 그래도 해봤는데여..

일단은 Clientsocket.socket.Receivebuf(P,Size(P));

로 받았잖아요..

용일님이 말씀하신대로면 DataReceive.Re[1]에 보낸 데이타를 어떻게 넣는지가 궁금합니다.



전체적으로 다시 정리하면

Record를 SendStream으로 보냈쟎아요..

그러면 ClientSocket에서는

type

DataReceive = packed record

Re : Array[1..3] of double;

end;



procedure ClientSocket.Read(..)

var

P : DataReceive;

begin

ClientSocket.Socket.ReceiveBuf(P, SizeOf(P));

로 받쟎아요..

그러면 저는 서버에서 보낸 첫번째 값 P.Data[1]:=10.000을 클라이언트에서는

결국 P.Re[1]에 10.000이 들어가야한는데..

P.Re[1]:=?

P.Re[2]:=?

P.Re[3]:=?

을 어떻게 해야 서버에서 보낸 P.Data[1]:=10.000을 P.Re[1]으로

P.data[2]:=20.000을 P.Re[2]에 받게 하는지를 잘 모르겠어여..

이 부분좀 자세히 설명좀 해주세여..

그리고



제가 연습했던 부분은 다음과 같습니다.



서버부분

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

unit se;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ScktComp;



type

Packet = Packed Record

DataSend : Array[1..3] of Double;

end;

TForm1 = class(TForm)

ServerSocket1: TServerSocket;

Button1: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);

begin

ServerSocket1.Active:=True;

end;



procedure TForm1.Button1Click(Sender: TObject);

var

P : Packet;

S : TMemoryStream;

begin

S:=TMemoryStream.Create;

P.DataSend[1]:=10;

P.DataSend[2]:=20;

P.DataSend[3]:=30;

S.write(P,Sizeof(P));

Try

ServerSocket1.Socket.SendStream(S);

finally

S.Free;

end;

end;

end.



클라이언트 부분

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

unit re;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ScktComp;



type

DataReceive = Packed Record

Data : Array[1..3] of Double;

end;

TForm1 = class(TForm)

ClientSocket1: TClientSocket;

Memo1: TMemo;

procedure FormCreate(Sender: TObject);

procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.FormCreate(Sender: TObject);

begin

ClientSocket1.Active:=True;

end;



procedure TForm1.ClientSocket1Read(Sender: TObject;

Socket: TCustomWinSocket);

var P : DataReceive;

begin

ClientSocket1.Socket.ReceiveBuf(P,Sizeof(P));

Memo1.Lines.Add(FloatToStr(P.Data[1]));

Memo1.Lines.Add(FloatToStr(P.Data[2]));

Memo1.Lines.Add(FloatToStr(P.Data[3]));

end;

end.

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

Error가 나오는데..뭔질 모르겠어요..

어디가 잘못됐는지 부탁드립니다.

급해서 그런데요..빠른답변 부탁드립니다.





3  COMMENTS
  • Profile
    김일영 2000.09.01 07:09
    최용일님의 소스를 약간 수정해서 돌려보시고는 OutofMemory 에러가 발생한다고 다시 질문하셨죠...

    그런데 답변을 올리신 최용일님께서도 더 이상 알기가 어려우나 Re: Array[1..3] of string; 으로

    선언된 부분이 문제가 있지 않겠느냐고 하셨습니다.

    저도 원인을 잘 모르겠습니다...

    디버깅을 좀 더 해보신 후에 그래도 안되시면 디버깅 해보신 내용을 적어주시면 또 생각해보겠습니다...





    찾는이 wrote:

    > 질문>

    > 제가 그래도 해봤는데여..

    > 일단은 Clientsocket.socket.Receivebuf(P,Size(P));

    > 로 받았잖아요..

    > 용일님이 말씀하신대로면 DataReceive.Re[1]에 보낸 데이타를 어떻게 넣는지가 궁금합니다.

    >

    > 전체적으로 다시 정리하면

    > Record를 SendStream으로 보냈쟎아요..

    > 그러면 ClientSocket에서는

    > type

    > DataReceive = packed record

    > Re : Array[1..3] of double;

    > end;

    >

    > procedure ClientSocket.Read(..)

    > var

    > P : DataReceive;

    > begin

    > ClientSocket.Socket.ReceiveBuf(P, SizeOf(P));

    > 로 받쟎아요..

    > 그러면 저는 서버에서 보낸 첫번째 값 P.Data[1]:=10.000을 클라이언트에서는

    > 결국 P.Re[1]에 10.000이 들어가야한는데..

    > P.Re[1]:=?

    > P.Re[2]:=?

    > P.Re[3]:=?

    > 을 어떻게 해야 서버에서 보낸 P.Data[1]:=10.000을 P.Re[1]으로

    > P.data[2]:=20.000을 P.Re[2]에 받게 하는지를 잘 모르겠어여..

    > 이 부분좀 자세히 설명좀 해주세여..

    > 그리고

    >

    > 제가 연습했던 부분은 다음과 같습니다.

    >

    > 서버부분

    > ------------------------------------

    > unit se;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ScktComp;

    >

    > type

    > Packet = Packed Record

    > DataSend : Array[1..3] of Double;

    > end;

    > TForm1 = class(TForm)

    > ServerSocket1: TServerSocket;

    > Button1: TButton;

    > procedure FormCreate(Sender: TObject);

    > procedure Button1Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > ServerSocket1.Active:=True;

    > end;

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > P : Packet;

    > S : TMemoryStream;

    > begin

    > S:=TMemoryStream.Create;

    > P.DataSend[1]:=10;

    > P.DataSend[2]:=20;

    > P.DataSend[3]:=30;

    > S.write(P,Sizeof(P));

    > Try

    > ServerSocket1.Socket.SendStream(S);

    > finally

    > S.Free;

    > end;

    > end;

    > end.

    >

    > 클라이언트 부분

    > -----------------------------------------

    > unit re;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ScktComp;

    >

    > type

    > DataReceive = Packed Record

    > Data : Array[1..3] of Double;

    > end;

    > TForm1 = class(TForm)

    > ClientSocket1: TClientSocket;

    > Memo1: TMemo;

    > procedure FormCreate(Sender: TObject);

    > procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > ClientSocket1.Active:=True;

    > end;

    >

    > procedure TForm1.ClientSocket1Read(Sender: TObject;

    > Socket: TCustomWinSocket);

    > var P : DataReceive;

    > begin

    > ClientSocket1.Socket.ReceiveBuf(P,Sizeof(P));

    > Memo1.Lines.Add(FloatToStr(P.Data[1]));

    > Memo1.Lines.Add(FloatToStr(P.Data[2]));

    > Memo1.Lines.Add(FloatToStr(P.Data[3]));

    > end;

    > end.

    > -----------------------------------------------

    > Error가 나오는데..뭔질 모르겠어요..

    > 어디가 잘못됐는지 부탁드립니다.

    > 급해서 그런데요..빠른답변 부탁드립니다.

    >

    >

  • Profile
    최용일 2000.08.31 22:08
    안녕하세요. 최용일입니다.



    질문하신 의도가 무엇인지 도저히 알 수가 없군요. 나타난 에러가 뭔지도 모르겠구요...



    제생각엔 델파이 도움말을 한번 더 보시는 것이 나을듯 합니다.



    ^^



    찾는이 wrote:

    > 질문>

    > 제가 그래도 해봤는데여..

    > 일단은 Clientsocket.socket.Receivebuf(P,Size(P));

    > 로 받았잖아요..

    > 용일님이 말씀하신대로면 DataReceive.Re[1]에 보낸 데이타를 어떻게 넣는지가 궁금합니다.

    >

    > 전체적으로 다시 정리하면

    > Record를 SendStream으로 보냈쟎아요..

    > 그러면 ClientSocket에서는

    > type

    > DataReceive = packed record

    > Re : Array[1..3] of double;

    > end;

    >

    > procedure ClientSocket.Read(..)

    > var

    > P : DataReceive;

    > begin

    > ClientSocket.Socket.ReceiveBuf(P, SizeOf(P));

    > 로 받쟎아요..

    > 그러면 저는 서버에서 보낸 첫번째 값 P.Data[1]:=10.000을 클라이언트에서는

    > 결국 P.Re[1]에 10.000이 들어가야한는데..

    > P.Re[1]:=?

    > P.Re[2]:=?

    > P.Re[3]:=?

    > 을 어떻게 해야 서버에서 보낸 P.Data[1]:=10.000을 P.Re[1]으로

    > P.data[2]:=20.000을 P.Re[2]에 받게 하는지를 잘 모르겠어여..

    > 이 부분좀 자세히 설명좀 해주세여..

    > 그리고

    >

    > 제가 연습했던 부분은 다음과 같습니다.

    >

    > 서버부분

    > ------------------------------------

    > unit se;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ScktComp;

    >

    > type

    > Packet = Packed Record

    > DataSend : Array[1..3] of Double;

    > end;

    > TForm1 = class(TForm)

    > ServerSocket1: TServerSocket;

    > Button1: TButton;

    > procedure FormCreate(Sender: TObject);

    > procedure Button1Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > ServerSocket1.Active:=True;

    > end;

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > P : Packet;

    > S : TMemoryStream;

    > begin

    > S:=TMemoryStream.Create;

    > P.DataSend[1]:=10;

    > P.DataSend[2]:=20;

    > P.DataSend[3]:=30;

    > S.write(P,Sizeof(P));

    > Try

    > ServerSocket1.Socket.SendStream(S);

    > finally

    > S.Free;

    > end;

    > end;

    > end.

    >

    > 클라이언트 부분

    > -----------------------------------------

    > unit re;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ScktComp;

    >

    > type

    > DataReceive = Packed Record

    > Data : Array[1..3] of Double;

    > end;

    > TForm1 = class(TForm)

    > ClientSocket1: TClientSocket;

    > Memo1: TMemo;

    > procedure FormCreate(Sender: TObject);

    > procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > ClientSocket1.Active:=True;

    > end;

    >

    > procedure TForm1.ClientSocket1Read(Sender: TObject;

    > Socket: TCustomWinSocket);

    > var P : DataReceive;

    > begin

    > ClientSocket1.Socket.ReceiveBuf(P,Sizeof(P));

    > Memo1.Lines.Add(FloatToStr(P.Data[1]));

    > Memo1.Lines.Add(FloatToStr(P.Data[2]));

    > Memo1.Lines.Add(FloatToStr(P.Data[3]));

    > end;

    > end.

    > -----------------------------------------------

    > Error가 나오는데..뭔질 모르겠어요..

    > 어디가 잘못됐는지 부탁드립니다.

    > 급해서 그런데요..빠른답변 부탁드립니다.

    >

    >

  • Profile
    김일영 2000.08.31 19:47
    안녕하세요.

    최용일님의 답변 소스 실행은 해 보셨는지요.

    다시 질문하신 질문 내용이 뭔지 제가 파악이 안되는군요.

    하지만, 최용일님의 소스가 실행이 되는 거라면

    원하시던대로 서버가 보낸 구조체 형태의 데이터를 클라이언트에서 제대로 복원한 것 같은데요.

    그러면 P.Re[1] 등도 원래의 값이 제대로 전송되어 왔겠죠.

    질문 취지가 그거 아니신가요?

    아니시라면 좀 더 취지를 소상히 써 주시면 좋겠네요.

    수고하세요.

    ==========================================================================================

    찾는이 wrote:

    > 질문>

    > 제가 그래도 해봤는데여..

    > 일단은 Clientsocket.socket.Receivebuf(P,Size(P));

    > 로 받았잖아요..

    > 용일님이 말씀하신대로면 DataReceive.Re[1]에 보낸 데이타를 어떻게 넣는지가 궁금합니다.

    >

    > 전체적으로 다시 정리하면

    > Record를 SendStream으로 보냈쟎아요..

    > 그러면 ClientSocket에서는

    > type

    > DataReceive = packed record

    > Re : Array[1..3] of double;

    > end;

    >

    > procedure ClientSocket.Read(..)

    > var

    > P : DataReceive;

    > begin

    > ClientSocket.Socket.ReceiveBuf(P, SizeOf(P));

    > 로 받쟎아요..

    > 그러면 저는 서버에서 보낸 첫번째 값 P.Data[1]:=10.000을 클라이언트에서는

    > 결국 P.Re[1]에 10.000이 들어가야한는데..

    > P.Re[1]:=?

    > P.Re[2]:=?> P.Re[3]:=?

    > 을 어떻게 해야 서버에서 보낸 P.Data[1]:=10.000을 P.Re[1]으로

    > P.data[2]:=20.000을 P.Re[2]에 받게 하는지를 잘 모르겠어여..

    > 이 부분좀 자세히 설명좀 해주세여..

    > 그리고

    >

    > 제가 연습했던 부분은 다음과 같습니다.

    >

    > 서버부분

    > ------------------------------------

    > unit se;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ScktComp;

    >

    > type

    > Packet = Packed Record

    > DataSend : Array[1..3] of Double;

    > end;

    > TForm1 = class(TForm)

    > ServerSocket1: TServerSocket;

    > Button1: TButton;

    > procedure FormCreate(Sender: TObject);

    > procedure Button1Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > ServerSocket1.Active:=True;

    > end;

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > P : Packet;

    > S : TMemoryStream;

    > begin

    > S:=TMemoryStream.Create;

    > P.DataSend[1]:=10;

    > P.DataSend[2]:=20;

    > P.DataSend[3]:=30;

    > S.write(P,Sizeof(P));

    > Try

    > ServerSocket1.Socket.SendStream(S);

    > finally

    > S.Free;

    > end;

    > end;

    > end.

    >

    > 클라이언트 부분

    > -----------------------------------------

    > unit re;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls, ScktComp;

    >

    > type

    > DataReceive = Packed Record

    > Data : Array[1..3] of Double;

    > end;

    > TForm1 = class(TForm)

    > ClientSocket1: TClientSocket;

    > Memo1: TMemo;

    > procedure FormCreate(Sender: TObject);

    > procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.FormCreate(Sender: TObject);

    > begin

    > ClientSocket1.Active:=True;

    > end;

    >

    > procedure TForm1.ClientSocket1Read(Sender: TObject;

    > Socket: TCustomWinSocket);

    > var P : DataReceive;

    > begin

    > ClientSocket1.Socket.ReceiveBuf(P,Sizeof(P));

    > Memo1.Lines.Add(FloatToStr(P.Data[1]));

    > Memo1.Lines.Add(FloatToStr(P.Data[2]));

    > Memo1.Lines.Add(FloatToStr(P.Data[3]));

    > end;

    > end.

    > -----------------------------------------------

    > Error가 나오는데..뭔질 모르겠어요..

    > 어디가 잘못됐는지 부탁드립니다.

    > 급해서 그런데요..빠른답변 부탁드립니다.

    >

    >