Как подсчитать конрольную сумму в ip протоколе. Также как подсчитать ее же в tcp
Вооющем мне все это нужно для того, что бы посылать сформированные мной пакеты через RAW сокет.
ПС Если ее можно не посчитывать - то как это сделать для выше приведенных протоколов
int checksum(const u_short *addr, register int len)
{
register int nleft = len;
const u_short *w = addr;
register u_short answer;
register int sum = 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.
*/
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}/* mop up an odd byte, if necessary */
if (nleft == 1)
sum += htons(*(u_char *)w << 8);/*
* add back carry outs from top 16 bits to low 16 bits
*/
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* truncate to 16 bits */
return (answer);
}
а лучше её вообще в 0 поставить ядро само посчитает
вроде
>а лучше её вообще в 0 поставить ядро само посчитает
>вродеМожно ли что нить подобное паствить в tcphdr->check
Ну и еще один вопрос: Как нить миожно сделать чтобы source address в iphdr определялся автоматически
И при создании RAW socket'a обязательно ли ставить sin_addr.s_addr ?
>Можно ли что нить подобное паствить в tcphdr->check
>Ну и еще один вопрос: Как нить миожно сделать чтобы source address
>в iphdr определялся автоматически
>И при создании RAW socket'a обязательно ли ставить sin_addr.s_addr ?Ну что никто не знат что ли ?