View Single Post
  #12 (permalink)  
Old December 28th, 2001
cultiv8r cultiv8r is offline
Connoisseur
 
Join Date: August 9th, 2001
Location: Philadelphia, PA, USA
Posts: 358
cultiv8r is flying high
Default

Quote:
Originally posted by veniamin

Header = Record
ID: TGUID;
Function: Byte;
TTL:byte;
Hops:byte;
Datalength: Integer(???)
end;
Ah! Someone's using Delphi (or Pascal)!

Well, for that, I will give you the records used in my Cultiv8r client

Hopefully you can use them. Keep in mind that the records are packed! I'm using pointers to them, because I can easily reference them from memory that way - I read the entire message before processing.

Code:
Type
  // AKA Descriptor Header
  _PGHeader = ^_TGHeader;
  _TGHeader = packed record
    MsgID   : TGUID;
    Func    : byte;
    TTL     : byte;
    Hops    : byte;
    DataLen : integer;
  end;

  _PPong = ^_TPong;
  _TPong = packed record // 0x01
    Port      : word;
    IP        : integer;
    FileCount : dword;
    TotalSize : dword;
  end;

  // BYE packet - this is a proposal, see the GDF
  _PByeHead = ^_TByeHead;
  _TByeHead = packed record // 0x02
    Code : word;
  end;

  // Query Hit
  _PQueryResultHeader = ^_TQueryResultHeader;
  _TQueryResultHeader = packed record // 0x81
    Results : byte;
    Port    : word;
    IP      : integer;
    Speed   : integer;
  end;

  // Query Hit Result set
  _PQueryResultRecordHeader = ^_TQueryResultRecordHeader;
  _TQueryResultRecordHeader = packed record
    FileIndex : integer;
    FileSize  : integer;
  end;

  // Just the vendor ID m'am!
  _PQueryResultFooterExtensionHeader = ^_TQueryResultFooterExtensionHeader;
  _TQueryResultFooterExtensionHeader = packed record
    VendorID : array[0..3] of char;
  end;

  //  EQHD As used by many clients, ala BearShare
  _PQueryResultFooterExtensionDataOne = ^_TQueryResultFooterExtensionDataOne;
  _TQueryResultFooterExtensionDataOne = packed record
    DataLength : byte;
    Flag1,
    Flag2      : byte;
  end;

  // The GUID at the very end of the Query Hit
  _PQueryResultFooter = ^_TQueryResultFooter;
  _TQueryResultFooter = packed record
    ClientID : TGUID;
  end;

  // Push baby, Push!
  _PPush = ^_TPush;
  _TPush = packed record
    ClientID  : TGUID;
    FileIndex : integer;
    IP        : integer;
    Port      : integer;
  end;
Also, most newer clients use GUID marking. So you could use this snippet for creating your GUIDs:

Code:
function CreateGUID : TGUID;
begin
  CoCreateGUID(Result);

  Result.D4[0] := $FF;
  Result.D4[7] := $0;
end;
-- Mike
Reply With Quote