Q&A

  • 사용자 정의 패킷(Packet) 구성 및 레코드(Record) 전송 방법 등은?


1) 먼저 질문할것은 사용자 정의 패킷을 구성하는 방법과 만약에 어떤 구조체 아니면 레코드 정의된 것을 한번에 보내는 방법을 가르쳐 주세요(Udp)에서..

var Record

a: string;

b: string;

c: string;

end;



2) 위와 같은 것을 패킷으로 정의해서 보내는 방법



3) Udp에서 (Winshoes 컴포넌트에 WinshoeUdplistener라는 컴포넌트가 있는데 이것이 서버역할을 하는것인지 궁금하고여 왜냐하면 예제에는 Recieve하는 것은 되어 있는데 도대체 보내는 방법은 써 있질 않군요.. 아니면 WinshoeUdpClient가 서버 역할을 하는것인지 궁금합니다.)



4) 그리고 Tcp소켓과 Udp소켓 즉 서버를 구성하려고 하는데 한 프로그램안에 Tcp와 Udp가 있어서 문제는 없는지 궁금합니다.



그럼 답변 부탁드립니다.



1  COMMENTS
  • Profile
    김진호 2000.08.28 10:53
    > 1) 먼저 질문할것은 사용자 정의 패킷을 구성하는 방법과 만약에 어떤 구조체 아니면 레코드 정의된 것을 한번에 보내는 방법을 가르쳐 주세요(Udp)에서..

    > var Record

    > a: string;

    > b: string;

    > c: string;

    > end;



    > 2) 위와 같은 것을 패킷으로 정의해서 보내는 방법



    > 3) Udp에서 (Winshoes 컴포넌트에 WinshoeUdplistener라는 컴포넌트가 있는데 이것이 서버역할을 하는것인지 궁금하고여 왜냐하면 예제에는 Recieve하는 것은 되어 있는데 도대체 보내는 방법은 써 있질 않군요.. 아니면 WinshoeUdpClient가 서버 역할을 하는것인지 궁금합니다.)

    > 4) 그리고 Tcp소켓과 Udp소켓 즉 서버를 구성하려고 하는데 한 프로그램안에 Tcp와 Udp가 있어서 문제는 없는지 궁금합니다.

    >

    > 그럼 답변 부탁드립니다.

    >



    답변부터 말씀드리면



    procedure TForm1.FormCreate(Sender: TObject);

    type aa = record

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

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

    end;

    var

    bb : aa;

    mem : TMemoryStream;

    begin

    bb.a := '1234567890';

    bb.b := '0987654321';



    mem := TMemoryStream.Create;



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



    NMUDP1.SendStream(mem);

    end;



    procedure TForm1.NMUDP2DataReceived(Sender: TComponent;

    NumberBytes: Integer; FromIP: String; Port: Integer);

    type aa = record

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

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

    end;

    var

    bb : aa;

    mem : TMemoryStream;

    begin

    mem := TMemoryStream.Create;

    NMUDP2.ReadStream(mem);;

    mem.Read(bb, sizeof(bb));

    end;



    위와 같은 방법으로 가능 합니다..

    코드가 길지 않으니 금방 이해 하시리라 봅니다..



    1번 2번의 답변은 충분 하다고 생각 되구..

    3번의 답변은



    본래 UDP의 서버소켓이니, 클라이언소켓이니 하는건 없습니다..

    델파이 기본 UPD 컨포넌트 중에 이런 내용이 있습니다..

    RemoteHost = 'XXX.XXX.XXX.XXX'

    RemotePort = 3000

    LocalPort = 3001



    이걸 이해 하시면 그방 아실리라 밑는데..

    A라는 UDP와 B라는 UDP는 RemotePort와 LocalPort가 서루 교차 되있어야 합니다..

    (반드시 그런건 아니지만..클라이언트라고 생각 하시는 쪽의 RemotePort를 서버라구 생각 하시는

    쪽이랑 맞추세염..)





    A.RemotePort := 3001 B.RemotePort := 3000

    A.LocalPort := 3000 B.LocalPort := 3001

    되겠죠..

    또 C라는 UDP가 연결 된다면 (A가 서버의 역활을 한다는 가정)

    C.RemotePort := 3000

    C.LocalPort := 3001

    가 됩니다..



    그러니깐 결국 UDP는 서버하고자 하는 쪽의 포트만 맞으면 어디든 날라간다는 겁니다..

    글구 테스트 하실때..같은 PC에서 3개의 프로그램을 띄우시면 오류가 날껍니다..

    중복된 포트 때문이죠..(참고삼아)



    마지막 물음은 상관 없습니다..

    어짜피 포트번호가 다르니깐요..

    TCP/IP가 80을 쓰든가? 글구 UDP가 3?을 스니깐요..

    전혀 지장이 없습니다..



    끝으로

    데이타를 받는 이벤트에 구조체에 FillChar(bb, Sizeof(bb), 0); 을 써주시면 더 좋겠죠..

    글구 될수 있으면 string은 쓰지 마세여..그냥 a : array [0..9] of char; 이렇게 쓰시던지

    아님..string[10] 이렇게 쓰세여...

    그럼 즐코..