1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
   |  
SOCKET socketRaw;
 
// The WSAStartup function initiates use of WS2_32.DLL by a process.
bool initWSA()
{
	bool tempo = true;
	WSAData wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	 {
		 tempo = false;
	 }
	 return tempo;
}
 
// The WSACleanup function terminates use of the WS2_32.DLL.
void clearWSA()
{
	WSACleanup();
}
 
bool creat_Socket()
{
	bool tempo = true;
 
	socketRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0);
	if(socketRaw == INVALID_SOCKET)
	{
		tempo = false;
	}
	return tempo;
}
 
bool init_Socket()
{
	bool tempo = true;
	int sockOpt = 1;
	int result;
 
	// IPPROTO_IP IP_HDRINCL ==> Indique que l'IP header doit etre fourni par des données externes
	if((result = setsockopt(socketRaw, IPPROTO_IP, IP_HDRINCL, (char*)&sockOpt, sizeof(sockOpt))) == SOCKET_ERROR)
	{
		tempo = false;
	}
	return tempo;
}
 
bool send_Socket(struct sockaddr_in sock_info, IP * ip, ICMP * icmp)
{
	bool tempo = false;
	int result;
 
	char paquet[sizeof(ICMP) + sizeof(IP)]; //28 = sizeof(ICMP) + sizeof(IP)
 
	createICMPpaquet(ip, icmp, paquet);
 
	int t = sizeof(paquet);
 
	result = sendto(socketRaw, paquet, sizeof(paquet), 0, (struct sockaddr *)&sock_info, sizeof(sock_info));
 
	if(result != SOCKET_ERROR)
	{
		tempo = true;
	}
 
	return tempo;
}
 
void createICMPpaquet(IP *ip, ICMP *icmp, char * paquet)
{
	int icmpT = sizeof(*icmp);
	int ipT = sizeof(*ip);
 
	ZeroMemory(paquet, icmpT + ipT); //permet de remplir un bloc de mémoire avec des 0
	memcpy(paquet, ip, ipT); 
	paquet += ipT;
	memcpy(paquet, icmp, icmpT);
} | 
Partager