Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

Калькуляция 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
2-1165393606
Roman_ln
2006-12-06 11:26
2006.12.24
как вставить картинку с диска в форму


3-1160110659
buka
2006-10-06 08:57
2006.12.24
Высвечивание кода вместо текста


1-1163027394
knastya
2006-11-09 02:09
2006.12.24
открыт ли уже *.xls файл


4-1155807368
vodvorezlaya
2006-08-17 13:36
2006.12.24
Как скрыть окно чужой программы во время её работы


8-1147104861
NORDmen
2006-05-08 20:14
2006.12.24
прорисовать линию между компонентами