реклама на сайте
подробности

 
 
> tcp/ip
vesago
сообщение Oct 9 2006, 13:27
Сообщение #1


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Пытаюсь на меге гонять данные через GPRS. Не стал я пользовать готовые стеки типа айпи и лвп. Пишу свое приложение - порезаный tcp на нет. Так вот вопрос к тем кто разбирался с этой тематикой. Как правильно посчитать контрольную сумму для TCP пакета? Смотрел я упомянутые стеки. там для IP и TCP пакета вроде одинаковый алгоритм. Я позаимствовал их код. Снифером смотрел сетевой трафик в локалке - для TCP такой вариант не проходит - не сходится контрольная сумма.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ktod
сообщение Oct 9 2006, 16:40
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 27-09-05
Пользователь №: 8 979



Делаю так:
inline u16 checksum(u8* d, int l, u32 c)
{
while(l > 1)
{ c += *(u16*)d;
d += 2; l -= 2;
}
if(l) c += *d;

c = (c >> 16) + (c & 0xffff);
c += (c >> 16);
u16 ret = ((u16)(~c));
return ret;
}

где вызов:

u32 ph = (saddr) & 0xffff) + ( (saddr) >> 16) +
((daddr) & 0xffff) + ((daddr) >> 16) +
0x600 + ((u16)l);

u16 cs = checksum(d, l, ph);
u32 saddr и пр. берется из ип хедера.
Это для тсп.

для удп:
u32 ph = (saddr) & 0xffff) + ( (saddr) >> 16) +
((daddr) & 0xffff) + ((daddr) >> 16) +
0x1100 + ((u16)l);

u16 cs = checksum(d, l, ph);

для ип еще проще:
u16 cs = checksum(d, ihl, 0);


Не забываем, что для ип сумма считается только для заголовка.

Сообщение отредактировал ktod - Oct 9 2006, 16:43


--------------------
Ignoramus et Ignorabimus
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016