Q&A

  • 레코드를 C 구조체로 전달하는 방법 좀...
델파이로 구조체를 만들어서 서버로 데이타를 보낼려고합니다



서버는 C 로 되어있습니다.



typedef struct

{

char Msg_Type [4+1];

char Dept_Code [10+1];

char Data_Class;

char File_Name [24+1];

char Filler [51+1];

} Ssg_File_Recv_Start_Msg;



이게 서버쪽에 선언된 구조체구여



델파이쪽에선



type aa = record

Msg_Type : array [0..3] of char;

Dept_Code : array [0..9] of char;

Data_Class : char;

File_Name : array [0..23] of char;

Filler : array [0..50] of char;

end;



이렇게 선언했거든요



구조체단위로 패킷을 만들어서 서버로 데이타를 날려줄려고 합니다



여기에 있는 질답란을 뒤져보고 그대로 했는데



서버쪽에서 클라이언트 접속 신호만 받고 실제로 패킷을 받지 못하는거 같습니다



procedure TForm1.Button1Click(Sender: TObject);

type aa = record

Msg_Type : array [0..3] of char;

Dept_Code : array [0..9] of char;

Data_Class : char;

File_Name : array [0..23] of char;

Filler : array [0..50] of char;

end;

var

Packet : aa;

mem : TMemoryStream;

begin



Packet.Msg_Type := 'FT12';

Packet.Dept_Code := 'SSG00003';

Packet.Data_Class := '0';

Packet.File_Name := 'FT12.c';

Packet.Filler := 'FTP';



mem := TMemoryStream.Create;



mem.Write(Packet, sizeof(Packet));



clientsocket1.Address := '211.xxx.xx.xx';

clientsocket1.Port := 5005;



clientsocket1.Active := true;

clientsocket1.socket.SendStream(mem);

end;





초보라서 저게 무슨뜻인지도 모르고 그대로 따라했습니다



왜 데이타를 받지 못하는걸까요..



조언 부탁드리겠습니다

2  COMMENTS
  • Profile
    박서규 2001.12.27 14:27
    왕초짜 wrote:

    > 델파이로 구조체를 만들어서 서버로 데이타를 보낼려고합니다

    >

    > 서버는 C 로 되어있습니다.

    >

    > typedef struct

    > {

    > char Msg_Type [4+1];

    > char Dept_Code [10+1];

    > char Data_Class;

    > char File_Name [24+1];

    > char Filler [51+1];

    > } Ssg_File_Recv_Start_Msg;

    >

    > 이게 서버쪽에 선언된 구조체구여

    >

    > 델파이쪽에선

    >

    > type aa = record

    > Msg_Type : array [0..3] of char;

    > Dept_Code : array [0..9] of char;

    > Data_Class : char;

    > File_Name : array [0..23] of char;

    > Filler : array [0..50] of char;

    > end;

    >

    > 이렇게 선언했거든요

    >

    > 구조체단위로 패킷을 만들어서 서버로 데이타를 날려줄려고 합니다

    >

    > 여기에 있는 질답란을 뒤져보고 그대로 했는데

    >

    > 서버쪽에서 클라이언트 접속 신호만 받고 실제로 패킷을 받지 못하는거 같습니다

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > type aa = record

    > Msg_Type : array [0..3] of char;

    > Dept_Code : array [0..9] of char;

    > Data_Class : char;

    > File_Name : array [0..23] of char;

    > Filler : array [0..50] of char;

    > end;

    > var

    > Packet : aa;

    > mem : TMemoryStream;

    > begin

    >

    > Packet.Msg_Type := 'FT12';

    > Packet.Dept_Code := 'SSG00003';

    > Packet.Data_Class := '0';

    > Packet.File_Name := 'FT12.c';

    > Packet.Filler := 'FTP';

    >

    > mem := TMemoryStream.Create;

    >

    > mem.Write(Packet, sizeof(Packet));

    >

    > clientsocket1.Address := '211.xxx.xx.xx';

    > clientsocket1.Port := 5005;

    >

    > clientsocket1.Active := true;

    > clientsocket1.socket.SendStream(mem);

    > end;

    >

    >

    > 초보라서 저게 무슨뜻인지도 모르고 그대로 따라했습니다

    >

    > 왜 데이타를 받지 못하는걸까요..

    >

    > 조언 부탁드리겠습니다



    의외로 간단할 수 있겠군요....

    많은 분들이 아마도 그 넘때문에 골때리는 에러가 발생합니다.... 알고보면 별거 아니지만요... 델파이에 기본적으로 들어있는 ClientSocket은 그 윗넘한테 상속받는 형태로 되어있는데 그 제일 위넘이 하는 SendStream의 소스가...



    while True do

    begin

    StartPos := FSendStream.Position;

    AmountInBuf := FSendStream.Read(Buffer, SizeOf(Buffer));

    if AmountInBuf > 0 then

    begin

    AmountSent := send(FSocket, Buffer, AmountInBuf, 0);



    부분적으로 이렇게 되어있죠... 소스를 보면 아시겠지만...

    스트림 전체를 버퍼로 잡아서 보내는게 아니고 현재의 포지션에서 읽기때문에 님의 문제는 스트림.position := 0;이라는 간단한 문장을 보내기 직전에 해주시면 해결될것 같군요... 그리고 아시겠지만 이넘은 DropStream이라는 내부함수를 부르기때문에 걔가 알아서 스트림을 없애주므로 보낸후에 Free를 시키면 걍.. 에러납니다...

    왜 이렇게 맹글었는지는 모르겠지만 많은 분들이 본인의 실수로 오인하면 시간을 뺏기는 부분중 하나입니다.... 그럼 해결을 기대하면서...

  • Profile
    왕초짜 2001.12.28 06:06
    박서규님..



    정말 감사드립니다.



    덕분에 지금은 아~주 잘 된답니다. ^^



    친절한 답변 다시한번 감사드리구여 새해 복 많이 많으세여~



    그럼.. 이만.. (__)



    박서규 wrote:

    > 왕초짜 wrote:

    > > 델파이로 구조체를 만들어서 서버로 데이타를 보낼려고합니다

    > >

    > > 서버는 C 로 되어있습니다.

    > >

    > > typedef struct

    > > {

    > > char Msg_Type [4+1];

    > > char Dept_Code [10+1];

    > > char Data_Class;

    > > char File_Name [24+1];

    > > char Filler [51+1];

    > > } Ssg_File_Recv_Start_Msg;

    > >

    > > 이게 서버쪽에 선언된 구조체구여

    > >

    > > 델파이쪽에선

    > >

    > > type aa = record

    > > Msg_Type : array [0..3] of char;

    > > Dept_Code : array [0..9] of char;

    > > Data_Class : char;

    > > File_Name : array [0..23] of char;

    > > Filler : array [0..50] of char;

    > > end;

    > >

    > > 이렇게 선언했거든요

    > >

    > > 구조체단위로 패킷을 만들어서 서버로 데이타를 날려줄려고 합니다

    > >

    > > 여기에 있는 질답란을 뒤져보고 그대로 했는데

    > >

    > > 서버쪽에서 클라이언트 접속 신호만 받고 실제로 패킷을 받지 못하는거 같습니다

    > >

    > > procedure TForm1.Button1Click(Sender: TObject);

    > > type aa = record

    > > Msg_Type : array [0..3] of char;

    > > Dept_Code : array [0..9] of char;

    > > Data_Class : char;

    > > File_Name : array [0..23] of char;

    > > Filler : array [0..50] of char;

    > > end;

    > > var

    > > Packet : aa;

    > > mem : TMemoryStream;

    > > begin

    > >

    > > Packet.Msg_Type := 'FT12';

    > > Packet.Dept_Code := 'SSG00003';

    > > Packet.Data_Class := '0';

    > > Packet.File_Name := 'FT12.c';

    > > Packet.Filler := 'FTP';

    > >

    > > mem := TMemoryStream.Create;

    > >

    > > mem.Write(Packet, sizeof(Packet));

    > >

    > > clientsocket1.Address := '211.xxx.xx.xx';

    > > clientsocket1.Port := 5005;

    > >

    > > clientsocket1.Active := true;

    > > clientsocket1.socket.SendStream(mem);

    > > end;

    > >

    > >

    > > 초보라서 저게 무슨뜻인지도 모르고 그대로 따라했습니다

    > >

    > > 왜 데이타를 받지 못하는걸까요..

    > >

    > > 조언 부탁드리겠습니다

    >

    > 의외로 간단할 수 있겠군요....

    > 많은 분들이 아마도 그 넘때문에 골때리는 에러가 발생합니다.... 알고보면 별거 아니지만요... 델파이에 기본적으로 들어있는 ClientSocket은 그 윗넘한테 상속받는 형태로 되어있는데 그 제일 위넘이 하는 SendStream의 소스가...

    >

    > while True do

    > begin

    > StartPos := FSendStream.Position;

    > AmountInBuf := FSendStream.Read(Buffer, SizeOf(Buffer));

    > if AmountInBuf > 0 then

    > begin

    > AmountSent := send(FSocket, Buffer, AmountInBuf, 0);

    >

    > 부분적으로 이렇게 되어있죠... 소스를 보면 아시겠지만...

    > 스트림 전체를 버퍼로 잡아서 보내는게 아니고 현재의 포지션에서 읽기때문에 님의 문제는 스트림.position := 0;이라는 간단한 문장을 보내기 직전에 해주시면 해결될것 같군요... 그리고 아시겠지만 이넘은 DropStream이라는 내부함수를 부르기때문에 걔가 알아서 스트림을 없애주므로 보낸후에 Free를 시키면 걍.. 에러납니다...

    > 왜 이렇게 맹글었는지는 모르겠지만 많은 분들이 본인의 실수로 오인하면 시간을 뺏기는 부분중 하나입니다.... 그럼 해결을 기대하면서...