В стандарте описан формат пакетов UDP. Там есть поле, по типу CRC, которое проверяют маршрутизаторы и, если чексум не совпадает (пакет повреждён), они такой пакет дропают. В стандарте ещё сказано, что это поле можно отключить (заполнить нулями) чтоб маршрутизаторы ничего не дропали, что мне собственно и нужно реализовать. В документации Win2k3 написано, что ось командует сетевой карте чтоб она высчитывала этот самый чексум и заполняла данное поле в пакете. Кто-нибудь знает (не)документированный способ отключения этого дела в сокете UDP? Сырые сокеты не предлагать.
В МСДН описан флажок UDP_NOCHECKSUM. Однако в SDK написано, что некоторые маршрутизаторы плевать хотели на нули в этом поле - все равно дропают.
1. контрольная сумма UDP заголока может(но не должна) проверяться только в конечных точках соединения (отправитель-получатель пакета) - это значит, что маршрутизаторы плевать хотели не на пакеты с неверной чексум, а вообще на UDP заголовки так как маршрутизаторы транспортного уровня касаться не должны 2.(уже не по самому вопросу, а по теме) контрольная сумма считается не по алгоритму CRC, а по алгоритму "сложение в обратном коде (с циклическим переносом из старшего разряда в младший)" - такой же как в заголовке IP. но я так и непонял - что это за "сложение" буду рад если кто подскажет. 3. а правда... кто знает точно, в winsock - кто это поле и в какой момент заполняет?
За UDP не скажу, но сложение видимо такое (обычное, без переноса), некоторые проги используют для контроля своих пакетов (результат в eax) Код (Text): mov esi,data xor eax,eax @@: add eax,dword [esi] add esi,4 cmp esi,sizeof.data jnz @B
bogrus Контрольные суммы Инета описываются в RFC 1071. Там все несколько хитрее, правда, я не знаю, насколько Называется "шестнадцатибитная сумма с поразрядным дополнением"