про check_sum в пинге - PullRequest
       1

про check_sum в пинге

0 голосов
/ 24 ноября 2011

Я прочитал код пинга.и я запутался этот код

    *(u_char *)(&u) = *(u_char *)w ;

в этой функции, я думаю, у вас есть значение 0, почему назначение снова.

/*
 *                      I N _ C K S U M
 *
 * Checksum routine for Internet Protocol family headers (C Version)
 *
 */
in_cksum(addr, len)
u_short *addr;
int len;
{
        register int nleft = len;
        register 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 ) {
                u_short u = 0;

                *(u_char *)(&u) = *(u_char *)w ;
                sum += u;
        }

        /*
         * 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);
}

1 Ответ

2 голосов
/ 24 ноября 2011
&u

- указатель на u.

(u_char *)(&u)

- это указатель u_char на u.

*(u_char *)(&u)

разыменовывает этот указатель, поэтому

*(u_char *)(&u) = *(u_char *)w ;

копирует первый байт из w в первый байт u. Второй байт равен нулю.

(Предполагается, что, как сделали авторы этого кода, short имеет ширину 16 бит. Согласно стандарту C это не обязательно так.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...