Opravte prosim link na Builder. Na www.buzilder.cz/.. rozhodne nic neni :-)
Překlep :-) Napíšu do redakce a určitě odkaz co nejdříve změní.
Zdravim. Chcem sa na nieco spytat. Neviem cim to je ale nedari sa mi odoslat ECHo ziadost. Mam spraveny prog., ktory odchytava ICMP pakety a ked niekoho pingnem beznym Windowsovskym pingom zachytim ECHO odpoved. Ked sa vsak pokusam vyslat vlastnu ziadost ECHO nedostanem nic. Neviem kde robim chybu. Snad v tom ze vobec nevyplnam checksum. Pre ostatne typy packetov to funguje aj bez neho ale pre ICMP asi nie. Pritom pri vysialani su data na socket skutocne odoslane. Posielam 32B udajov tak ako bezny Win ping. Do buffra som skusal zahrnut aj IP hlavicku a skusal som to aj bez nej ale aj tak to nejde. PLEASE HELP ME.
A příklad, který je v článku funguje? Kontrolní součet by se vyplňovat měl, ale nejsem si jistý, jestli v tom je zrovna chyba.
Zkousel jsem program pod linuxem a nechce mi to vytvorit socket. Nejsem prihlaseny jako root. Mohlo by to byt tim?
Da se zjistit nejaky lepsi popis chyby? Z -1 toho clovek moc nevycte:)
Dik.
Funkce pro výpočet kontrolního součtu je špatná, a výše zmíněná nelze nijak rozumně použít. Po relativně náročném hledání a úpravě jsem našel konečně funkční verzi:
uint16_t checksum(uint8_t *addr_b, unsigned len)
{
uint16_t* addr = (uint16_t*) addr_b;
uint16_t answer = 0;
/*
* Our algorithm is simple, using a 32 bit accumulator (sum), we add
* sequential 16 bit words to it, and at the end, fold back all the
* carry bits from the top 16 bits into the lower 16 bits.
*/
uint32_t sum = 0;
while (len > 1) {
sum += *addr++;
len -= 2;
}
// mop up an odd byte, if necessary
if (len == 1) {
*(unsigned char *)&answer = *(unsigned char *)addr ;
sum += answer;
}
// add back carry outs from top 16 bits to low 16 bits
sum = (sum >> 16) + (sum & 0xffff); // add high 16 to low 16
sum += (sum >> 16); // add carry
answer = ~sum; // truncate to 16 bits
return answer;
}