同上

解决方案 »

  1.   

    unit main; interface uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    StdCtrls, OleCtrls, Registry; Const 
    SrcIP = '123.123.123.1'; 
    SrcPort = 1234; 
    DestIP = '123.123.123.2'; 
    DestPort = 4321; Max_Message = 4068; 
    Max_Packet = 4096; type TPacketBuffer = Array[0..Max_Packet-1] of byte; TForm1 = class(TForm) 
    Button1: TButton; 
    Memo1: TMemo; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    procedure SendIt; 
    end; // IP Header 
    type 
    T_IP_Header = record 
    ip_verlen : Byte; 
    ip_tos : Byte; 
    ip_totallength : Word; 
    ip_id : Word; 
    ip_offset : Word; 
    ip_ttl : Byte; 
    ip_protocol : Byte; 
    ip_checksum : Word; 
    ip_srcaddr : LongWord; 
    ip_destaddr : LongWord; 
    end; 
      

  2.   

    // UDP Header 
    Type 
    T_UDP_Header = record 
    src_portno : Word; 
    dst_portno : Word; 
    udp_length : Word; 
    udp_checksum : Word; 
    end; // Some Winsock 2 type declarations 
    u_char = Char; 
    u_short = Word; 
    u_int = Integer; 
    u_long = Longint; SunB = packed record 
    s_b1, s_b2, s_b3, s_b4: u_char; 
    end; 
    SunW = packed record 
    s_w1, s_w2: u_short; 
    end; 
    in_addr = record 
    case integer of 
    0: (S_un_b: SunB); 
    1: (S_un_w: SunW); 
    2: (S_addr: u_long); 
    end; 
    TInAddr = in_addr; 
    Sockaddr_in = record 
    case Integer of 
    0: (sin_family: u_short; 
    sin_port: u_short; 
    sin_addr: TInAddr; 
    sin_zero: array[0..7] of Char); 
    1: (sa_family: u_short; 
    sa_data: array[0..13] of Char) 
    end; 
    TSockAddr = Sockaddr_in; 
    TSocket = u_int; const 
    WSADESCRIPTION_LEN = 256; 
    WSASYS_STATUS_LEN = 128; type 
    PWSAData = ^TWSAData; 
    WSAData = record // !!! also WSDATA 
    wVersion: Word; 
    wHighVersion: Word; 
    szDescription: array[0..WSADESCRIPTION_LEN] of Char; 
    szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char; 
    iMaxSockets: Word; 
    iMaxUdpDg: Word; 
    lpVendorInfo: PChar; 
    end; 
    TWSAData = WSAData; // Define some winsock 2 functions 
    function closesocket(s: TSocket): Integer; stdcall; 
    function socket(af, Struct, protocol: Integer): TSocket; stdcall; 
    function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; 
    tolen: Integer): Integer; stdcall;{} 
    function setsockopt(s: TSocket; level, optname: Integer; optval: PChar; 
    optlen: Integer): Integer; stdcall; 
    function inet_addr(cp: PChar): u_long; stdcall; {PInAddr;} { TInAddr } 
    function htons(hostshort: u_short): u_short; stdcall; 
    function WSAGetLastError: Integer; stdcall; 
    function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall; 
    function WSACleanup: Integer; stdcall; const 
    AF_INET = 2; // internetwork: UDP, TCP, etc. IP_HDRINCL = 2; // IP Header Include SOCK_RAW = 3; // raw-protocol interface IPPROTO_IP = 0; // dummy for IP 
    IPPROTO_TCP = 6; // tcp 
    IPPROTO_UDP = 17; // user datagram protocol 
    IPPROTO_RAW = 255; // raw IP packet INVALID_SOCKET = TSocket(NOT(0)); 
    SOCKET_ERROR = -1; var 
    Form1: TForm1; implementation 
      

  3.   

    implementation // Import Winsock 2 functions 
    const WinSocket = 'WS2_32.DLL'; function closesocket; external winsocket name 'closesocket'; 
    function socket; external winsocket name 'socket'; 
    function sendto; external winsocket name 'sendto'; 
    function setsockopt; external winsocket name 'setsockopt'; 
    function inet_addr; external winsocket name 'inet_addr'; 
    function htons; external winsocket name 'htons'; 
    function WSAGetLastError; external winsocket name 'WSAGetLastError'; 
    function WSAStartup; external winsocket name 'WSAStartup'; 
    function WSACleanup; external winsocket name 'WSACleanup'; 
    {$R *.DFM} // 
    // Function: checksum 
    // 
    // Description: 
    // This function calculates the 16-bit one's complement sum 
    // for the supplied buffer 
    // 
    function CheckSum(Var Buffer; Size : integer) : Word; 
    type 
    TWordArray = Array[0..1] of Word; 
    var 
    ChkSum : LongWord; 
    i : Integer; 
    begin 
    ChkSum := 0; 
    i := 0; 
    While Size > 1 do begin 
    ChkSum := ChkSum + TWordArray(Buffer)[i]; 
    inc(i); 
    Size := Size - SizeOf(Word); 
    end; if Size=1 then ChkSum := ChkSum + Byte(TWordArray(Buffer)[i]); ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF); 
    ChkSum := ChkSum + (Chksum shr 16); Result := Word(ChkSum); 
    end; 
    procedure BuildHeaders( 
    FromIP : String; 
    iFromPort : Word; 
    ToIP : String; 
    iToPort : Word; 
    StrMessage : String; 
    Var Buf : TPacketBuffer; 
    Var remote : TSockAddr; 
    Var iTotalSize : Word 
    ); 
    Var 
    dwFromIP : LongWord; 
    dwToIP : LongWord; iIPVersion : Word; 
    iIPSize : Word; 
    ipHdr : T_IP_Header; 
    udpHdr : T_UDP_Header; iUdpSize : Word; 
    iUdpChecksumSize : Word; 
    cksum : Word; Ptr : ^Byte; procedure IncPtr(Value : Integer); 
    begin 
    ptr := pointer(integer(ptr) + Value); 
    end; begin 
    // Convert ip address'ss