Спасибо, попробую.
Увы не сходится. Я смотрел снифером пакет:
Код
volatile unsigned char buf[] = {
0xC0, 0xA8, 0x01, 0x08, //src addr
0xC0, 0xA8, 0x01, 0x0E, //dst addr
0x11, 0x42, 0x13, 0x88, //Сам TCP пакет всего 25 октетов
0x97, 0xD4, 0xA2, 0x11,
0x1B, 0x01, 0x1A, 0x63,
0x50, 0x18, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00,
0x31, 0x31, 0x31, 0x31, 0x31
};
Для него контрольная сумма 0x04EA. Может под нетбиосом как-то по другому считается?
Зато контрольная сумма сходится если посчитать этой процедуро предварительно tcp_crc = 6 + 25.
Код
void Calc_TCP_CRC(unsigned char *buf, unsigned int len, unsigned int *tcp_crc)
{
unsigned long crc = *tcp_crc;
unsigned int *ptr_to_buf = (unsigned int*)buf;
unsigned int i, tmp;
i = 0;
do
{
tmp = (*(ptr_to_buf))>>8;
tmp += (*(ptr_to_buf++))<<8;
crc += tmp;
i += 2;
}while(i<len);
if((len/2) & 1) crc += *((unsigned char*)ptr_to_buf);
crc = (crc >> 16) + crc & 0xffff;
crc += (crc >> 16);
crc=(unsigned int)(~crc);
*tcp_crc = (unsigned int)crc;
}
volatile unsigned int tcp_crc = 6 + 25;
Calc_TCP_CRC((unsigned char *)&buf, 33, (unsigned int *)&tcp_crc);
По сути дела она работает как и ваша. Просто хотелось бы иметь одну процедуру. которая считала бы и для IP и для TCP как в вашем случае. в приаттаченой статье тоже говорится что одна функция. Не могу понять чего у меня не работает.