Существует ли уже существующая функция или код, который я могу использовать для вычисления контрольной суммы сегмента TCP в программе POSIX - PullRequest
0 голосов
/ 21 марта 2012

Я пишу небольшую POSIX-программу, и мне нужно вычислить контрольную сумму сегмента TCP, я хотел бы использовать существующую функцию, чтобы не писать ее самостоятельно.

Что-то вроде (псевдокод):

char *data = ....
u16_integer = computeChecksum(data);

Я искал в Интернете, но не нашел правильного ответа, есть предложения?

1 Ответ

1 голос
/ 21 марта 2012

Здесь более или менее прямо взяты из RFC:

uint16_t ip_calc_csum(int len, uint16_t * ptr)
{

        int sum = 0;
        unsigned short answer = 0;
        unsigned short *w = ptr;
        int nleft = len;

        while (nleft > 1) {
                sum += *w++;
                nleft -= 2;
        }

        sum = (sum >> 16) + (sum & 0xFFFF);
        sum += (sum >> 16);
        answer = ~sum;
        return (answer);
}
...