Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Help. CRC Tcp пакета [D6, Win2k]


JorSand ©   (2003-08-27 00:33:00) 

Нужен алгоритм расчета CRC TCP пакета, если кто писал бросьте исходник-с плиз. Очень надо. Да, и RFC я уже читал, может конечно плохо, итог - у меня не вышел каменный цветок.


JorSand   (2003-08-28 13:46:00) [1]

спасибо


Jeer   (2003-08-28 12:39:00) [2]

http://www.programme.ru/archive/2001/1/012001_3_2.phtml


JorSand   (2003-08-28 10:25:00) [3]

IP_PROTO_TCP равен 6 ????
Длина в псевдозаголовке (size) это есть = длина заголовока TCP пакета + кол-во байт данных?


Verg   (2003-08-27 10:45:00) [4]

Ошибочка:


> ushort get_tcp_checksum(ip_header *iph, tcp_hdr* tcph,
> size_t size) { // длина TCP пакета - заголовок+данные
> tcp_pseudohdr ph;
> ph.tph_saddr = iph -> ip_src;
> ph.tph_daddr = iph -> ip_dst;
> ph.tph_zero = 0;
> ph.tph_proto = IP_PROTO_TCP;
> ph.tph_len = size;
> return net_chksum_add(
> net_checksum( &ph, sizeof( ph ) ),
> net_checksum( tcph, size ));
> };


Verg   (2003-08-27 10:39:00) [5]

Писал, только на С:

ushort net_checksum( void *data, size_t len )
{
ulong sum = 0;
ushort *dp = (ushort*)data;
ushort sum_s;
int words = len >> 1;

while( words -- )
sum += *dp ++;

if( len & 1 )
sum += *(uchar*) dp;

sum = (ushort) sum + (sum >> 16) & 0xffff;
sum_s = (ushort) sum + (ushort)(sum >> 16);
return sum_s != 0xffff ? ~sum_s : sum_s;
}

ushort net_chksum_add( ushort s1, ushort s2 )
{
ulong sum = (ulong) s1 + (ulong) s2;
ushort usum = (ushort) sum;

sum = sum > 0xffff ? usum + 1 : usum;
if( !sum && (s1 || s2) )
return 0xffff;
else
return sum;
}


Кс TCP пакета:
Сумма котрольных кодов TCP пакета вместе с данными и псевдозаголовка TCP:

ushort get_udp_checksum(ip_header *iph, tcp_hdr* tcph, size_t size) {
tcp_pseudohdr ph;
ph.tph_saddr = iph -> ip_src;
ph.tph_daddr = iph -> ip_dst;
ph.tph_zero = 0;
ph.tph_proto = IP_PROTO_TCP;
ph.tph_len = tcph -> uh_ulen;
return net_chksum_add(
net_checksum( &ph, sizeof( ph ) ),
net_checksum( tcph, size ));
};


JorSand   (2003-08-27 10:30:00) [6]

всем участвовавшим в обсуждении этого вопроса - большое человеческое спасибо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо