Форум: "Сети";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
ВнизКалькуляция TCP-чексуммы Найти похожие ветки
← →
Тореро (2006-08-01 08:29) [0]Здравствуйте
В общем, сабж у меня не выходит, смотрел разные варианты с интернета - ни один неправильный. во всяком случае, Ирис на эти пакеты ругается, говорит, что чексумма в тцп-заголовке неверна. вот код:
function CheckSum(var Buffer; Size: integer): word;
type
TWordArray = Array[0..1] of word;
var
lSumm: LongWord;
iLoop: integer;
begin
lSumm := 0;
iLoop := 0;
while Size > 1 do
begin
lSumm := lSumm + TWordArray(Buffer)[iLoop];
inc(iLoop);
Size := Size - SizeOf(word);
end;
if Size = 1 then lSumm := lSumm + Byte(TWordArray(Buffer)[iLoop]);
lSumm := (lSumm shr 16) + (lSumm and $FFFF);
lSumm := lSumm + (lSumm shr 16);
Result := word(not lSumm);
end;
----------
IP_HDR = packed record
VerLen: UCHAR;
Service: UCHAR;
Length: WORD;
Ident: WORD;
FlagOff: WORD;
TimeLive: UCHAR;
Protocol: UCHAR;
Checksum: WORD;
Source: DWORD;
Destination: DWORD;
end;
PIP_HDR = ^IP_HDR;
TCP_HDR = packed record
Source: WORD;
Destination: WORD;
Seq: DWORD;
Ack: DWORD;
Len: UCHAR;
Off_Rsvd: UCHAR;
Window: WORD;
Checksum: WORD;
Urg: WORD;
end;
PTCP_HDR = ^TCP_HDR;
TPseudo_hdr = packed record
source_address: cardinal;
dest_address: cardinal;
placeholder: byte;
protocol: byte;
tcp_length: byte;
tcphdr: tcp_hdr;
end;
----------
procedure SendIpPacket(FromMac, FromIP, ToMac, ToIp: string);
var packet: array[0..sizeof(ETHERNET_HDR)+sizeof(IP_HDR)+sizeof(tcp_hdr) -1] of char;
pseudo: TPseudo_hdr;
PEth: PETHERNET_HDR;
PIP: PIP_HDR;
PTCP: PTCP_HDR;
err: array[0..PCAP_ERRBUF_SIZE] of char;
csize: word;
Datap: ^byte;
tcplen: word;
procedure IncPtr(value: integer);
begin
Datap:=pointer(integer(datap)+value);
end;
begin
try
pEth:=PETHERNET_HDR(@Packet[0]);
pIp:=PIp_HDR(@packet[sizeof(ETHERNET_HDR)]);
PTcp:=PTcp_hdr(@packet[sizeof(ETHERNET_HDR)+sizeof(IP_HDR)]);
peth.Destination:=Str2Mac(ToMac);
peth.Source:=Str2Mac(FromMac);
peth.Protocol:=htons(PROTO_IP);
pip.Source:=ntohl(Str2Ip(FromIp));
pip.Destination:=ntohl(Str2Ip(ToIp));
pIp.VerLen:=$45;
pIp.Service:=0;
pIp.Length:=htons(sizeof(IP_HDR)+SizeOf(TCP_HDR));
pIp.Ident:=htons(2300);
pIp.FlagOff:=$40;
pIp.TimeLive:=128;
pIp.Protocol:=IPPROTO_TCP;
pIp.Checksum:=0;
pIp.Checksum:=CheckSum(pIp^, sizeof(IP_HDR));
pTcp.Source:=htons(80);
pTcp.Destination:=htons(21);
pTcp.Ack:=0;
pTcp.Seq:=htons(1500);
pTcp.Len:=80;
pTcp.Off_Rsvd:=$02;
pTcp.window:=htons(64240);
pTcp.Urg:=0;
pTcp.Checksum:=0;
pseudo.source_address:=pip.Source;
pseudo.dest_address:=pip.Destination;
pseudo.placeholder:=0;
pseudo.protocol:=IPPROTO_TCP;
pseudo.tcp_length:=28;
pseudo.tcphdr:=pTcp^;
pTcp.Checksum:=Checksum(pseudo, sizeof(pseudo));
pTcp.Checksum после выполнения процедуры имеет неправильное значение. помогите, плиз =)
← →
Сергей М. © (2006-08-01 08:54) [1]http://66.249.93.104/search?q=cache:f-FGkbhqcdkJ:www.delphimaster.ru/cgi-bin/forum.pl%3Fn%3D4%26id%3D1122921929%26p%3D1+Delphi+%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80+%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0+%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9+%D1%81%D1%83%D0%BC%D0%BC%D1%8B+%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0+TCP&hl=ru&gl=ru&ct=clnk&cd=8&client=firefox-a
← →
Тореро (2006-08-01 08:59) [2]о, спасибо. юзал поиск тут, не нашёл ) сейчас зачитаем-с
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.052 c