Oppure

Loading
31/12/11 18:09
Danyez
Ciao, ragazzi ! :D
Sotto natale la voglia di lavorare come al solito mi parte a mille ed eccomi qui da voi per domandarvi aiuto :D

Come da titolo, il mio "dilemma" riguarda i raw sockets : sto cercando di stabilire una connessione con un server solo tramite raw sockets. Direte voi : "perchè ?" .. perchè mi va ! :D

Ho studiato la struttura dei pacchetti ed ho già mappato con wireshark l'uscita del mio pacchetto per controllare che fosse "valido" (sono su Linux). Il pacchetto appare 'ben costruito' e viaggia senza alcun problema, ma la mia domanda è : perchè non ricevo alcuna risposta dal server (quando invece dovrei ricevere un pacchetto SYN/ACK flaggati ?) ?

Codice :
    sin.sin_family = AF_INET;
    sin.sin_port = htons(80);
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");

/* IP Struct */
    ip->ihl = 5;
    ip->version = 4;
    ip->tos = 16;
    ip->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
    ip->id = htons(52407);
    ip->frag_off = 0;
    ip->ttl = 64;
    ip->protocol = 6;
    ip->check = 0;
    ip->daddr = inet_addr("127.0.0.1");

    /* TCP Struct */
    tcp->source = htons(40661);
    tcp->dest = htons(80);
    tcp->seq = htonl(1);
    tcp->ack_seq = 0;
    tcp->doff = 5;
    tcp->syn = 1;
    tcp->ack = 0;
    tcp->window = htons(14600);
    tcp->check = 0;
    tcp->urg_ptr = 0;

    ip->check = csum((unsigned short *) buffer, sizeof(struct iphdr) + sizeof(struct tcphdr)); //Inserimento Checksum

    if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) < 0) { //Fornisco IP Struct
        perror("Error.");
    }
    printf("Invio SYN\n");
    sendto(sd, buffer, ip->tot_len, 0, (struct sockaddr *) &sin, sizeof(sin));



Un grazie ed un augurio di buon anno :k:

Edit : A quanto pare il mio problema riguarda strettamente il calcolo del checksum TCP (segnalato come Offloaded da Wireshark).
Qualcuno saprebbe indicarmi dove trovare i passaggi esatti per il calcolo del checksum ?
Ultima modifica effettuata da Danyez 02/01/12 9:22
aaa
04/01/12 11:55
jack92
Ciao, credo che dipenda dal fatto che non hai inserito tutte le informazioni della "struct IP". Devi aggiungere:
ip->saddr = inet_addr("127.0.0.1"); // IP del PC che invia il pacchetto
.
Spero ti sia utile: unsecure.altervista.org/rawsocket/… :k:
aaa