Salut,
Je suis sur un projet et je dois simuler l'envoi de paquets ICMP sur le réseau. J'ai déjà fait un petit programme de test (repris en partie depuis le forum). Il est sensé envoyer une demande d'echo puis recevoir la réponse, et j'ai un autre programme qui répond mais lors de l'exécution, mon programme plante totalement! Je ne comprends vraiment pas d'où vient l'erreur...
Pour information, je développe sous Wndows avec Dev-C++, mais mon code doit aussi être portable sous Linux.
Merci de m'aider au plus vite......
Voici mon code :
================================================================================
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
//Structures IP et ICMP
typedef struct _IP_HEADER
{
unsigned char VS_LET;
unsigned char TOS;
unsigned short Size;
unsigned short ID;
unsigned Flags:3;
unsigned Offset:13;
unsigned char TTL;
unsigned char Proto;
unsigned short Checksum;
unsigned int IPsource;
unsigned int IPdest;
char IP_DATA[1];
}IPHEADER;
typedef struct _ICMP_HEADER
{
unsigned char Type;
unsigned char Code;
unsigned short Checksum;
unsigned short ID;
unsigned short SEQ;
char ICMP_DATA[1];
}ICMPHEADER;
int main()
{
//Déclaration des variables
ICMPHEADER *ICMP_HEADER;
IPHEADER *IP_HEADER;
char ip_buffer[100], icmp_buffer[100], rcv_buffer[100];
int mySocket;
struct sockaddr_in IP_sock_info;
int tailleSocket = sizeof(IP_sock_info);
//Début du code
WSACleanup();
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
mySocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
bind(mySocket, (SOCKADDR*)&IP_sock_info, tailleSocket);
IP_sock_info.sin_family = AF_INET;
IP_sock_info.sin_addr.s_addr = inet_addr("157.26.98.200");
//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;
strcpy(ICMP_HEADER->ICMP_DATA, "12345678");
//Initialisation de la partie IP
IP_HEADER->VS_LET = 69;
IP_HEADER->TOS = 0;
IP_HEADER->Size = 36;
IP_HEADER->ID = 16;
IP_HEADER->Flags = 2;
IP_HEADER->Offset = 0;
IP_HEADER->TTL = 100;
IP_HEADER->Proto = 1;
IP_HEADER->Checksum = 0;
IP_HEADER->IPsource = inet_addr("157.26.98.204");
IP_HEADER->IPsource = inet_addr("157.26.98.200");
memcpy(&IP_HEADER->IP_DATA, &ICMP_HEADER, 16);
//Début de la communication
sendto(mySocket, (char *)IP_HEADER, 36, 0, (struct sockaddr *)&IP_sock_info, tailleSocket);
printf("Datagramm envoyé\n");
recvfrom(mySocket, rcv_buffer, 100, 0, NULL, NULL);
printf("Réception du paquet OK\n");
printf("Copie des header reçus...");
memcpy(IP_HEADER, &rcv_buffer[0], 36);
printf(" ->");
memcpy(ICMP_HEADER, &rcv_buffer[0], 16);
printf(" -> Copie terminée\n");
printf("Chaine reçue : %s", ICMP_HEADER->ICMP_DATA);
getch();
}
================================================================================