Bonsoir à toutes et à tous !
Je me mets actuellement à la programmation windows avec l’API win32.
Mon petit projet de la soirée: envoyé un ping avec icmpsendecho, en utilisant au maximum l’API windows. Pour cela je voudrais pouvoir tout mettre en Unicode cependant j’ai quelques soucis avec les différents types et je me perds entre les TCHAR, WHAR, PWCHAR etc.
Je viens vers vous pour que vous m’éclaireriez sur le sujet.
Ci-dessous mon code actuel:
// easy_ping.c
#include "common.h"
int easy_ping(PWSTR ip) {
// Declare and initialize variables
HANDLE hIcmpFile;
IPAddr ipaddr = INADDR_NONE;
DWORD dwRetVal = 0;
TCHAR SendData[50] = L"Data Buffer";
LPVOID ReplyBuffer = NULL;
DWORD ReplySize = 0;
InetPton(AF_INET, ip, &ipaddr);
hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE) {
printf("\tUnable to open handle.\n");
printf("IcmpCreatefile returned error: %ld\n", GetLastError());
return 1;
}
printf("%zd", sizeof(SendData));
ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
ReplyBuffer = (VOID*)malloc(ReplySize);
if (ReplyBuffer == NULL) {
printf("\tUnable to allocate memory\n");
return 1;
}
dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000);
if (dwRetVal != 0) {
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
IPAddr ReplyAddr;
ReplyAddr = pEchoReply->Address;
printf("\tSent icmp message to %S\n", ip);
if (dwRetVal > 1) {
printf("\tReceived %ld icmp message responses\n", dwRetVal);
printf("\tInformation from the first response:\n");
}
else {
printf("\tReceived %ld icmp message response\n", dwRetVal);
printf("\tInformation from this response:\n");
}
TCHAR ipaddrreply[128] = { 0 };
InetNtop(AF_INET, &ReplyAddr, ipaddrreply, sizeof(ipaddrreply));
printf("\t Received from %S\n", ipaddrreply);
printf("\t Status = %ld\n",
pEchoReply->Status);
printf("\t Roundtrip time = %ld milliseconds\n",
pEchoReply->RoundTripTime);
return 0;
}
else {
printf("\tCall to IcmpSendEcho failed.\n");
printf("\tIcmpSendEcho returned error: %ld\n", GetLastError());
return 1;
}
}
// main.c
#include "easy_ping.h"
int __cdecl main(int argc, char** argv) {
int i = easy_ping(L"8.8.8.8");
return 0;
}
// common.h
#pragma once
//////////////////////////// Unicode Build Option /////////////////////////////
// Always compiler using Unicode.
#ifndef UNICODE
#define UNICODE
#endif
// When using Unicode Windows functions, use Unicode C-Runtime functions too.
#ifdef UNICODE
#ifndef _UNICODE
#define _UNICODE
#endif
#endif
#include <tchar.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <icmpapi.h>
#include <stdio.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
// easy_ping.h
#pragma once
int easy_ping(char* ip);
Mon but final est d’avoir un code écrit de la meilleure des manières.
J’ai par exemple une question sur la taille de la variable ipaddrreply (dans easy_ping.c ligne 47). Quelle devrait être sa taille ? (sachant qu’au maximum une IP c’est 255.255.255.255 mais en unicode)
Merci !
+0
-0