Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Raw Sockets - Risposta Server
Forum - C/C++ - Raw Sockets - Risposta Server

Avatar
Danyez (Normal User)
Newbie


Messaggi: 15
Iscritto: 28/01/2010

Segnala al moderatore
Postato alle 19:09
Sabato, 31/12/2011
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 :
Codice sorgente - presumibilmente C/C++

  1. sin.sin_family = AF_INET;
  2.     sin.sin_port = htons(80);
  3.     sin.sin_addr.s_addr = inet_addr("127.0.0.1");
  4.  
  5. /* IP Struct */
  6.     ip->ihl = 5;
  7.     ip->version = 4;
  8.     ip->tos = 16;
  9.     ip->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr);
  10.     ip->id = htons(52407);
  11.     ip->frag_off = 0;
  12.     ip->ttl = 64;
  13.     ip->protocol = 6;
  14.     ip->check = 0;
  15.     ip->daddr = inet_addr("127.0.0.1");
  16.  
  17.     /* TCP Struct */
  18.     tcp->source = htons(40661);
  19.     tcp->dest = htons(80);
  20.     tcp->seq = htonl(1);
  21.     tcp->ack_seq = 0;
  22.     tcp->doff = 5;
  23.     tcp->syn = 1;
  24.     tcp->ack = 0;
  25.     tcp->window = htons(14600);
  26.     tcp->check = 0;
  27.     tcp->urg_ptr = 0;
  28.  
  29.     ip->check = csum((unsigned short *) buffer, sizeof(struct iphdr) + sizeof(struct tcphdr)); //Inserimento Checksum
  30.  
  31.     if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) < 0) { //Fornisco IP Struct
  32.         perror("Error.");
  33.     }
  34.     printf("Invio SYN\n");
  35.     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 il 02/01/2012 alle 10:22
PM
Avatar
jack92 (Member)
Pro


Messaggi: 100
Iscritto: 06/08/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 12:55
Mercoledì, 04/01/2012
Ciao, credo che dipenda dal fatto che non hai inserito tutte le informazioni della "struct IP". Devi aggiungere:
Codice sorgente - presumibilmente C/C++

  1. ip->saddr = inet_addr("127.0.0.1"); // IP del PC che invia il pacchetto


Non dipende da questo, credo sia stato un problema nel copia-incolla (in realtà quel campo l'ho specificato) :) - Danyez - 04/01/12 23:22
Non dipende da questo, credo sia stato un problema nel copia-incolla (in realtà quel campo l'ho specificato) :) - Danyez - 04/01/12 23:22
(scusa il doppio post, ho sbagliato a premer invio due volte) So per certo che il problema viene dal Checksum TCP, ho bisogno delle procedure di calcolo da tradurre in codice :) - Danyez - 04/01/12 23:23
Ok, ma il calcolo mi sembra corretto (guarda il link)... Il valore di "saddr" è sempre 127.0.0.1 ? Se non è così, prova a mettere un IP ?valido? ( IP riferito alla rete che usi). - jack92 - 05/01/12 10:33
Già fatto, gli IP che ho trascritto erano semplicemente d'esempio. Il Checksum che vedi calcolato in quel source è per l'header IP, non header TCP. :) - Danyez - 05/01/12 20:39
PM