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