Cześć napisałem sobie program (wraz z pomocą dokumentacji z mdsn), który ma dodawac wpis do tablicy arp.
Generalnie działa ok, (tylko z uprawnieniami administratora :( ), jednakże, mam problem ze zrozumieniem kawałka kodu. Poniżej dodaje całość. Zaznaczony fragment zaczyna się od start, a kończy na stop. Jeżeli wywalę tamta cześć kodu i dodam zamiast tego
GetIpAddrTable(pIpAddrtable, &dwSize, 0)
GetIpAddrTable(pIpAddrtable, &dwSize, 0) t
o program działa, aczkolwiek jestem pewny, że coś jest nie tak. Mógłby ktoś wyjaśnić o co to chodzi?
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
ULONG ulOutBufLen;
DWORD dwRetVal;
PIP_ADAPTER_INFO pAdapterInfo;
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) {
free (pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen );
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) {
printf("GetAdaptersInfo call failed with %d\n", dwRetVal);
}
PMIB_IPADDRTABLE pIpAddrtable;
DWORD dwSize = 0;
DWORD dwRetVal2 = 0;
IN_ADDR IPAddr;
free(pIpAddrtable);
pIpAddrtable = (MIB_IPADDRTABLE *) malloc(dwSize*2);
PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
PMIB_IPNETROW pArpEntry;
DWORD ip = inet_addr("182.221.231.1");
//start
if (pIpAddrtable)
{
if (GetIpAddrTable(pIpAddrtable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)
{
free(pIpAddrtable);
cout <<"Za mała ilosc pamięci";
}
if (pIpAddrtable == NULL) {
printf("Memory allocation failed for GetIpAddrTable\n");
exit(1);
}
if (dwRetVal2 = GetIpAddrTable(pIpAddrtable, &dwSize, 0) != NO_ERROR)
{
printf("Mamy error %s", dwRetVal2);
}
}
//stop
pArpEntry->dwIndex = pIpAddrtable->table[0].dwIndex;
pArpEntry->dwPhysAddrLen = 6;
pArpEntry->bPhysAddr[0] = '0x01';
pArpEntry->bPhysAddr[1] = '0xb2';
pArpEntry->bPhysAddr[2] = '0xd3';
pArpEntry->bPhysAddr[3] = '0xd4';
pArpEntry->bPhysAddr[4] = '0x05';
pArpEntry->bPhysAddr[5] = '0x16';
pArpEntry->dwType = MIB_IPNET_TYPE_STATIC;
pArpEntry->dwAddr = ip;
if (CreateIpNetEntry(pArpEntry) == ERROR_ACCESS_DENIED)
{
cout <<"Dostęp zabroniony ";
}
while (pAdapter)
{
printf(TEXT("Nazwa adaptera: %s \n"), pAdapter->AdapterName);
printf("Adres adaptera: %s \n", pAdapter->IpAddressList.IpAddress.String);
printf("Maska: %s \n ", pAdapter->IpAddressList.IpMask.String);
printf("Opis: %s \n ", pAdapter->Description);
printf("Serwer DHCP %s \n ", pAdapter->DhcpServer.IpAddress.String);
printf("Indeks: %5d \n ", pAdapter->Index);
cout <<endl;
pAdapter = pAdapter->Next;
}
return 0;
}