Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Прочитал такую вещь: 18.01.07 23:37 Число просмотров: 4243
Автор: makeworld Статус: Member
|
Прочитал такую вещь:
Поле контрольной суммы — это 16-битное дополнение суммы всех 16- битных слов заголовка и текста. Если сегмент содержит в заголовке и тексте нечетное количество октетов, подлежащих учету в контрольной сумме, последний октет будет дополнен нулями справа с тем, чтобы образовать для предоставления контрольной сумме 16-битное слово. Возникший при таком выравнивании октет не передается вместе с сегментом по сети. Перед вычислением контрольной суммы поле этой суммы заполняется нулями.
Особенно заинтересовало, что "последний октет будет дополнен нулями справа с тем, чтобы образовать для предоставления контрольной сумме 16-битное слово" при таком коде в качестве примера:
unsigned short CalculateChecksum(unsigned short *usBuf, int iSize)
{
unsigned long usChksum=0;
while (iSize>1)
{
usChksum+=*usBuf++;
iSize-=sizeof(unsigned short);
}
if (iSize)
usChksum+=*(unsigned char*)usBuf;
usChksum=(usChksum >> 16) + (usChksum & 0xffff);
usChksum+=(usChksum >> 16);
return (unsigned short)(~usChksum);
}
---
т.е. если число октетов нечетное, берется сумма WORD'ов + последний байт. дополнения нулями справа до WORDa не происходит.
http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.network.tcp.checksum
|
|
|