2012-11-21 15 views
1

如何正確發送數據包到UDP服務器?我正在嘗試,但它不起作用,我沒有收到任何來自服務器的信息。IdUDPClient,如何發送數據包到服務器?

我需要的是發送一個數據包:int64|int|int

,並從服務器接收數據包回:int|int|int64

如何正確做呢?謝謝。

type 
    Tconnecting = record 
    a: int64; 
    b: integer; 
    c: integer; 
    end; 
    Treply_connect = record 
    a: integer; 
    b: integer; 
    c: int64; 
    end; 

var 
    udp: TIdUDPClient; 
    send_data: TIdBytes; 
    received_data: TIdBytes; 
    i: integer; 
    packet: Tconnecting; 
    reply_packet: Treply_connect; 

begin 
    packet.a := 41727101980; 
    packet.b := 0; 
    packet.c := RandomRange(1, 9999999); 
    SetLength(send_data, sizeof(packet)); 
    Move(packet, send_data[0], sizeof(packet)); 
    udp := TIdUDPClient.Create(nil); 
    try 
    udp.Host := 'server.com'; 
    udp.Port := 1234; 
    udp.SendBuffer(send_data); 
    SetLength(received_data, 0); 
    i := udp.ReceiveBuffer(received_data, 5000); 
    Memo1.Lines.Add('Data reiceived! Len:'+IntToStr(Length(received_data))+',data:|'+BytesToString(received_data, 0)+'|'); 
    finally 
    FreeAndNil(udp); 
    end; 

回答

5

您沒有正確使用ReceiveBuffer()。您將輸出緩衝區的大小設置爲0字節,因此ReceiveBuffer()將不具有任何內存來讀取接收到的數據。您需要預先分配輸出緩衝區到您期望的最大大小。 ReceiveBuffer()的返回值將告訴你實際讀入緩衝區的字節數。

換句話說,改變這種:

SetLength(received_data, 0); 

要這樣:

SetLength(received_data, SizeOf(Treply_connect)); 

並改變這一點:

Memo1.Lines.Add('Data reiceived! Len:'+IntToStr(Length(received_data))+', data:|'+BytesToString(received_data, 0)+'|'); 

要這樣:

Memo1.Lines.Add('Data received! Len:'+IntToStr(i)+', data:|'+BytesToString(received_data, 0, i)+'|'); 

在一個單獨的說明,印有一個RawToBytes()功能,你可以用你的數據包複製到TIdBytes

​​

而且當你要提取的接收包一個BytesToRaw()功能:

BytesToRaw(received_data, reply_packet, SizeOf(reply_packet));