InetPton () конвертирует любой IP в 1.0.0.0

Я пытаюсь отправить пинг на какой-то IP через ICMP но InetPton() функция, которая должна преобразовывать строковые IP-адреса в двоичную форму, всегда возвращает один и тот же ip: «1.0.0.0».

Мой код выглядит так:

short ip[4] = { 192, 168, 1, 2 };

bool checkIP() {
HANDLE hIcmpFile;
unsigned long ipaddr = INADDR_NONE;
DWORD dwRetVal = 0;
char SendData[32] = "Data Buffer";
LPVOID ReplyBuffer = NULL;
DWORD ReplySize = 0;

std::wostringstream strIP;
strIP << ip[0] << "." << ip[1] << "." << ip[2] << "." << ip[3];

in_addr ipAddress;
ipaddr = InetPton(AF_INET, strIP.str().c_str(), &ipAddress);
if (ipaddr != 1)
{
SendMessage((HWND)StatusBar, (UINT)SB_SETTEXT, (WPARAM)(INT)1 | 0, (LPARAM)(LPSTR)TEXT("Invalid IP format!"));
return false;
}

hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE)
{
SendMessage((HWND)StatusBar, (UINT)SB_SETTEXT, (WPARAM)(INT)1 | 0, (LPARAM)(LPSTR)TEXT("Unable to open ICMP handle!"));
return false;
}

ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
ReplyBuffer = (VOID*)malloc(ReplySize);
if (ReplyBuffer == NULL)
{
SendMessage((HWND)StatusBar, (UINT)SB_SETTEXT, (WPARAM)(INT)1 | 0, (LPARAM)(LPSTR)TEXT("Unable to allocate memory!"));
return false;
}

dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, 2000);
if (dwRetVal != 0)
{
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
struct in_addr ReplyAddr;
ReplyAddr.S_un.S_addr = pEchoReply->Address;
IcmpCloseHandle(hIcmpFile);
return true;
}
else {
IcmpCloseHandle(hIcmpFile);
return false;
}
return true;
}

Итак, я анализирую сеть с WireShark и я вижу, что PING всегда отправляется 1.0.0.0. Я полагаю, что проблема заключается в InetPton() функционировать, но не понимаю, где.

1

Решение

IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, 2000);

Должно быть:

IcmpSendEcho(hIcmpFile, ipAddress, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, 2000);

Ваш ipaddr 1, вероятно, это источник 1.0.0.0 адрес.

1

Другие решения

Ваш код кажется немного не здесь;

in_addr* ipAddress;
ipaddr = InetPton(AF_INET, strIP.str().c_str(), &ipAddress);

ipAddress здесь будет неинициализированный указатель на in_addr, на который вы передаете указатель в InetPton. Что такое InetPton действительно want — указатель на фактическую структуру / буфер, который он может заполнить;

in_addr ipAddress;
ipaddr = InetPton(AF_INET, strIP.str().c_str(), &ipAddress);
3

По вопросам рекламы [email protected]