int Socket_IP;
struct sockaddr_in ip_sock_info;
int lsock=sizeof(struct sockaddr_in);
void START_WS(void); // ---- WSACleanup()
void CLEAR_WS(void); // ---- WSAStartup()
// ----- Calcule le checksum, Nb_S : nombre de Short
unsigned short CALCUL_CHECKSUM(unsigned short * ptr, int Nb_S);
// ------- Main ----------------------------
int main(){
// ------ Initialisation de la partie ICMP
ICMP_HEADER->Type=8;
ICMP_HEADER->Code=0;
ICMP_HEADER->ID=1;
ICMP_HEADER->SEQ=1;
ICMP_HEADER->Checksum=0;
memcpy(&ICMP_HEADER->ICMP_DATA,"12345678",8);
ICMP_HEADER->Checksum=htons(CALCUL_CHECKSUM((unsigned short *)ICMP_HEADER,8));
// ------ Initialisation de la partie IP
IP_HEADER->VS_LET=69; // --- (ip_version << 4) | ip_len;
IP_HEADER->TOS=0;
IP_HEADER->Size=htons(36);
IP_HEADER->ID=htons(16);
IP_HEADER->Flags=2;
IP_HEADER->Offset=0;
IP_HEADER->TTL=100;
IP_HEADER->Proto=1;
IP_HEADER->Checksum=0;
IP_HEADER->IP_S=inet_addr("82.65.1.50"); // --- mon ip lors des essais
IP_HEADER->IP_D=inet_addr("216.239.59.99");
IP_HEADER->Checksum=htons(CALCUL_CHECKSUM((unsigned short *)IP_HEADER,10));
memcpy(&IP_HEADER->IP_DATA,&ICMP_HEADER,16);
// --- Envoit de la requète
if(sendto(Socket_IP,(char*)IP_HEADER_X,36,0,(struct sockaddr *)&ip_sock_info,lsock)==-1)
{ printf("[Erreur] sendto socket_ip"); getchar(); return;}
else printf("Sendto socket_ip[ok]\n");
// --- Attente de la réponse
do{
if(recvfrom(Socket_IP,rcv_buf,100,0,NULL,NULL)==-1)
{printf("[Erreur] receivefrom\n"); getchar(); }
else printf("recvfrom [ok]\n");
memcpy(IP_HEADER,&rcv_buf[0],36); // --- on récupère le datagramme ip en entier
memcpy(ICMP_HEADER,&rcv_buf[20],16); // --- on récupère la partie icmp
}
while(ICMP_HEADER->Type!=0);
cs_darkstorm
Messages postés44Date d'inscriptiondimanche 3 février 2002StatutMembreDernière intervention22 mai 2006 8 oct. 2003 à 00:18
Salut,
Il n'y a pas de réponse tout simplement parce que tu ne calcules PAS le checksum de ton paquet ICMP, le noyau calcule automatiquement celui ip mais le ICMP s'obtient avec cette fonction :
function CheckSum(Var Buffer; Size : integer) : Word;
type
TWordArray = Array[0..1] of word;
var
ChkSum : LongWord;
i : Integer;
begin
ChkSum := 0;
i := 0;
While Size > 1 do begin
ChkSum := ChkSum + TWordArray(Buffer)[i];
inc(i);
Size := Size - SizeOf(Word);
end;
if Size=1 then ChkSum := ChkSum + Byte(TWordArray(Buffer)[i]);
ChkSum := (ChkSum and $FFFF) + (ChkSum shr 16);
Result := Word(not(ChkSum));
end;
Alors cette fonction est en delphi et je suis désolé parce que je connais très mal le C je viens de m'y mettre. alors le checksum s'obtient en aditionnant les WORD (2 bytes) du paquet ICMP + les données (32 bytes de base), ensuite on le transforme en WORD et on ajoute la retenue , et on inverse le tout (not) et on a notre checksum, arrête de me regarder avec ces yeux je te fais un cas pratique ;-)
Alors cette partie est la partie ICMP + données (totalement inventée)
alors le chk c'est
la somme des DWORD
33 + ADDD + 1344 ..... + 7475 = 59E62
On transforme en word :
59E62 = 9E62
On ajoute la retenue
9E62 + 5 = 9E67
On l'inverse
not(9E67)=6198
TADA !!!!
alors en t'inspirant de ma fonction delphi ben j'espère que tu t'en sortes ;-), le mieux est d'avoir un sniffer et cela te permettra d'analyser la trame pour savoir ce qui est faux.
Le meilleur sniffer gratuit est Ethereal et en plus Open-Source >:-P
cs_valoue
Messages postés72Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention13 mai 2011 22 juin 2004 à 14:56
Salut,
Je viens encore t'embeter ...
Je suis toujours sur mon client serveur, et je veux envoyer depuis le client un ping au serveur.
Pour la formulation du ping, no pb !
Lorsque le serveur recoit la requete, dois-je moi même traiter la reception et formuler la reponse, ou existe t-il un moyen de faire repondre le système automatiquement ?
Si je dois le faire moi même, je ne sais pas koi mettre dans la trame.
Peux tu me donner quelques explications stp ?
merci aardman
dark1933
Messages postés9Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention11 novembre 2005 11 nov. 2005 à 23:16
Salut,
Excusez moi mais depuis mon dernier post je ne m'étais plus occupé de programmation réseau, et je viens seulement de lire vos réponses.
Si je calcule le checksum du header ICMP :
IP_HEADER->Checksum=htons(CALCUL_CHECKSUM((unsigned short *)IP_HEADER,10));
l'impémentation reprise d'une autre source est la même que celle décrite par DarkStorm.