31/12/11 18:09
Danyez
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 :
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 ?
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 :
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 02/01/12 9:22
aaa