我寫了一些代碼(當然有mdsm的手動幫助),它可以在arp表中添加新的記錄。但是我有理解代碼的幾行代碼的問題。我在開始和停止標記之間標記了這些行。我不知道這部分代碼是多麼的令人興奮。如果我刪除標記段,並與不可懂的部分代碼arp數組,指針和內存分配(Windows IP函數)
GetIpAddrTable(pIpAddrtable, &dwSize, 0)
GetIpAddrTable(pIpAddrtable, &dwSize, 0)
程序替換事件運行「正常」,但一定出事了,我想了解什麼,爲什麼?我認爲這與內存分配有關。
#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;
}
1)'pArpEntry'未初始化。 2)在調用API函數時檢查錯誤,但至少在兩種情況下,您的代碼繼續進行,就好像沒有錯誤一樣。 3)你正在使用'C++',而不是'C'。你可以通過使用'malloc'消除所有的動態內存分配並使用'std :: vector'和'reinterpret_cast'將其轉換爲正確的指針類型來改善它。 –
PaulMcKenzie