Danyez (Normal User)
Newbie
Messaggi: 15
Iscritto: 28/01/2010
|
Ciao, ragazzi !
Sotto natale la voglia di lavorare come al solito mi parte a mille ed eccomi qui da voi per domandarvi aiuto
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 !
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 :
Codice sorgente - presumibilmente C/C++ |
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
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 il 02/01/2012 alle 10:22 |