+ Responder ao Tópico



  1. #1
    Visitante

    Padrão Problema ao calcular o checksum do cabecalho TCP

    Tenho essa struct para representar o cabecalho tcp e mais em baixo tenho a funcao de checksum.

    struct tcphdr {
    unsigned short porta_origem;
    unsigned short porta_destino;
    unsigned int numero_sequencia;
    unsigned int numero_reconhecimento;
    unsigned char comprimento_cabecalho;
    unsigned char flags;
    unsigned short janela;
    unsigned short checksum;
    unsigned short pont_urgente;
    };

    long inchksum (unsigned char *ptr, unsigned len)
    {
    register long sum = 0;
    register const WORD *wrd = (const WORD*) ptr;
    register long slen = (long)len;
    while (slen > 1)
    {
    sum += *wrd++;
    slen -= 2;
    }

    if (slen > 0) sum += *(const BYTE*)wrd;
    while (sum >> 16) sum = (sum & 0xFFFF) + (sum >> 16);
    return sum;
    }

    ...
    unsigned char pacote[1024];
    ip = (struct iphdr *) pacote;
    tcp = (struct tcphdr *) (pacote + sizeof(struct iphdr));
    data = (char *) (pacote + (sizeof(struct iphdr)+ sizeof(struct tcphdr)));

    ...

    Estou usando chamando a funcao de checksum apos setar todos os campos do cabecalho tcp inclusive o campo checksum como 0.

    ...
    inchksum((unsigned char *)tcp,sizeof(struct tcphdr) + datasize);
    ...

    sendo que datasize são dados adicionais ao cabecalho, que eu adiciono usando o ponteiro data. O cabecalho ip q nao estou citando está calculando o checksum de forma correta, e estou usando essa mesma forma.

    O que pode estar errado?

  2. #2
    Visitante

    Padrão Problema ao calcular o checksum do cabecalho TCP

    Fala cara, blz ?

    Experimente usar um tipo de STRLEN para capturar o tamanho exato da string, a contar o /0, q provavelmente esteja pegando lixo de memória..




    ( )´s