Checksum
От: AlexBSD Украина  
Дата: 05.03.03 09:06
Оценка:
Помогите, плз. Как вычислить Checksum TCP пакета. Как я зная это двоичное дополнение сложения слов в псевдозаголовке TCP, в пакете TCP и данных. Вот кусок кода, но он почему-то вычисляет неправильную контрольную сумму:
unsigned short MakeCRC(unsigned short *Buffer, int len)
{
    register int nleft=len;
    register unsigned short *w=Buffer;
    register unsigned short answer;
    register int sum=0;
    while(nleft>1)
    {
        sum+=*w;
        w++;
        nleft-=2;
    }
    if(nleft==1) sum+=*(unsigned char *)w;
    answer=~sum;

    return answer;
}

При этом вот код, который вызывает ф-ию:
PseudoTCPHeader ptcp;
ptcp.dest=ipp->iph.src;
ptcp.src=ipp->iph.dest;
ptcp.protocol=IPPROTO_TCP;
ptcp.lenght=htons(sizeof(ipp_send.tcph)+strlen(Data));

char *Buff;
Buff=new char[sizeof(ptcp)+sizeof(ipp_send.tcph)+strlen(Data)];
memset(Buff, 0, sizeof(ptcp)+sizeof(ipp_send.tcph)+strlen(Data));
Buff=(char *)memcpy(Buff, (void *)&ptcp, sizeof(ptcp));
memcpy(Buff+sizeof(ptcp), &ipp_send.tcph, sizeof(ipp_send.tcph));
memcpy(Buff+sizeof(ptcp)+sizeof(ipp_send.tcph), Data, strlen(Data));

Подскажите где ошибка.
WBR, AlexBSD.
... << RSDN@Home 1.0 beta 6a >>
Windows — MUSTDIE!!! FreeBSD — rulezzzz!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.