remote.sin_family := af_inet;
remote.sin_port := htons(itoport);
remote.sin_addr.s_addr := dwtoip;
end;
procedure tform1.sendit;
var
sh : tsocket;
bopt : integer;
ret : integer;
buf : tpacketbuffer;
remote : tsockaddr;
local : tsockaddr;
itotalsize : word;
wsdata : twsadata;
begin
// startup winsock 2
ret := wsastartup($0002, wsdata);
if ret<>0 then begin
memo1.lines.add('wsa startup failed.');
exit;
end;
with memo1.lines do begin
add('wsa startup:');
add('desc.: '+wsdata.szdescription);
add('status: '+wsdata.szsystemstatus);
end;
try
// create socket
sh := socket(af_inet, sock_raw, ipproto_udp);
if (sh = invalid_socket) then begin
memo1.lines.add('socket() failed: '+inttostr(wsagetlasterror));
exit;
end;
memo1.lines.add('socket handle = '+inttostr(sh));
// option: header include
bopt := 1;
ret := setsockopt(sh, ipproto_ip, ip_hdrincl, @bopt, sizeof(bopt));
if ret = socket_error then begin
memo1.lines.add('setsockopt(ip_hdrincl) failed: '+inttostr(wsagetlasterror));
exit;
end;
// build the packet
buildheaders( srcip, srcport,
destip, destport,
'this is a test packet',
buf, remote, itotalsize );
// send the packet
ret := sendto(sh, buf, itotalsize, 0, remote, sizeof(remote));
if ret = socket_error then
memo1.lines.add('sendto() failed: '+inttostr(wsagetlasterror))
else
memo1.lines.add('send '+inttostr(ret)+' bytes.');
// close socket
closesocket(sh);
finally
// close winsock 2
wsacleanup;
end;
end;
procedure tform1.button1click(sender: tobject);
begin
sendit;