版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目 錄</b></p><p> 設計目的...................................................................................................2</p><p> 二.功能介紹...............................
2、....................................................................2</p><p> 三.程序流程...................................................................................................2</p><p>
3、 四.設計步驟...................................................................................................4</p><p> 詳細設計......................................................................................
4、.............4</p><p> 六.設計總結..................................................................................................17</p><p> 七.參考文獻................................................
5、..................................................17</p><p><b> 設計目的</b></p><p> 通過課程設計,使學生理解和學會應用winsock來進行編程;使學生提高理論聯(lián)系實際解決實際問題的能力;也使學生對基于c++的網絡通信編程進行系統(tǒng)設計過程中的諸多具體問題有感性的認識和深入的理解;進而
6、提高學生的學習興趣為其將來順利進入畢業(yè)環(huán)節(jié)作必要的準備。</p><p><b> 功能介紹</b></p><p> ?。?)配置文件支持功能:使用配置文件存儲程序配置信息。</p><p> (2)網絡參數管理功能:能夠管理網絡參數,例如IP、機器名、掩碼和DNS等。(3)路由表管理功能:能夠查看和管理主機路由表條目。</p>
7、;<p><b> 三.程序流程</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p&
8、gt;<p><b> 圖1.程序流程圖</b></p><p><b> 四.設計步驟</b></p><p> 1. 資料整理 </p><p> 2. 配置文件支持功能 </p><p> 3. 網絡參數管理功能 </p><
9、p> 4. 路由表管理功能</p><p><b> 五.詳細設計</b></p><p> ?。ㄒ唬┇@取本地網絡配置信息</p><p> 圖2.獲取本地網絡配置信息</p><p> 本功能實現(xiàn)的是查詢本地網絡的基本配置信息,包括了主機名,注冊域名,DNS服務器,獲取信息后打印出來,如圖2,具體的代碼如
10、下:</p><p> int main()</p><p><b> {</b></p><p> FIXED_INFO fi;</p><p> ULONG ulOutBufLen = sizeof(fi)+100;</p><p> // 獲取本地電腦的網絡參數</p>
11、<p> /*if(GetNetworkParams(&fi, &ulOutBufLen) != ERROR_SUCCESS)</p><p><b> {</b></p><p> printf(" GetNetworkParams() failed \n");</p><p><
12、;b> getch();</b></p><p> return -1;</p><p><b> }*/</b></p><p> GetNetworkParams(&fi, &ulOutBufLen);</p><p><b> // 主機名稱</b>
13、</p><p> printf(" Host Name: %s \n", fi.HostName);</p><p> // 電腦注冊的域名</p><p> printf(" Domain Name: %s \n", fi.DomainName);</p><p> // 打印出所有的DNS
14、服務器</p><p> printf(" DNS Servers: \n");</p><p> printf(" \t%s \n", fi.DnsServerList.IpAddress.String);</p><p> IP_ADDR_STRING *pIPAddr = fi.DnsServerList.Next
15、;</p><p> while(pIPAddr != NULL)</p><p><b> {</b></p><p> printf(" \t%s \n", pIPAddr->IpAddress.String);</p><p> pIPAddr = pIPAddr->Next
16、;</p><p><b> }</b></p><p><b> getch();</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b>
17、(二)讀取網卡信息</b></p><p><b> 圖3.網卡信息</b></p><p><b> 圖4.網卡信息</b></p><p> 本功能實現(xiàn)的獲取本地網卡信息,打印出本地連接,無線連接,WiFi適配器等,具體的內容如圖所示,主要代碼如下:</p><p> typ
18、edef struct tagAdapterInfo</p><p><b> {</b></p><p> string strName; // 適配器名稱</p><p> string strDriverDesc; // 適配器描述</p><p> string strIP
19、; // IP地址</p><p> string strNetMask; // 子網掩碼</p><p> string strNetGate; // 網關</p><p> string strBroadcastIp; // 廣播地址</p><p> string
20、 strS; // 測試用的</p><p> }ADAPTER_INFO;</p><p> BOOL GetAdapterInfo();//獲取網絡適配器信息</p><p> BOOL RegGetIP(ADAPTER_INFO *pAI, LPCTSTR lpszAdapterName, int nIndex = 0);&l
21、t;/p><p> vector<ADAPTER_INFO*> AdapterInfoVector;</p><p> int main()</p><p><b> {</b></p><p> GetAdapterInfo();</p><p><b> int i
22、;</b></p><p> for (i = 0;i < AdapterInfoVector.size();i++)</p><p><b> {</b></p><p> cout << AdapterInfoVector[i]->strName << ":" <
23、;< endl << endl;</p><p> cout << " " << AdapterInfoVector[i]->strDriverDesc << endl;</p><p> cout << " " << AdapterI
24、nfoVector[i]->strIP << endl;</p><p> cout << " " << AdapterInfoVector[i]->strNetMask << endl;</p><p> cout << " " <<
25、 AdapterInfoVector[i]->strNetGate << endl;</p><p> cout << " " << AdapterInfoVector[i]->strBroadcastIp << endl;</p><p> cout << endl;</p
26、><p><b> }</b></p><p><b> getch();</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> // 取得所有網卡信息&l
27、t;/p><p> BOOL GetAdapterInfo()</p><p><b> {</b></p><p> // 這里的代碼適合WINDOWS2000,對于NT需要讀取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards</p
28、><p> HKEY hKey, hSubKey, hNdiIntKey;</p><p> if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,</p><p> "System\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}&quo
29、t;,</p><p><b> 0,</b></p><p><b> KEY_READ,</b></p><p> &hKey) != ERROR_SUCCESS)</p><p> return FALSE;</p><p> DWORD dwInde
30、x = 0;</p><p> DWORD dwBufSize = 256;</p><p> DWORD dwDataType;</p><p> char szSubKey[256];</p><p> unsigned char szData[256];</p><p> while(RegEnumKe
31、yEx(hKey, dwIndex++, szSubKey, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)</p><p><b> {</b></p><p> if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &hSubKey) == ERRO
32、R_SUCCESS)</p><p><b> { </b></p><p> if(RegOpenKeyEx(hSubKey, "Ndi\\Interfaces", 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS)</p><p><b> {&l
33、t;/b></p><p> dwBufSize = 256;</p><p> if(RegQueryValueEx(hNdiIntKey, "LowerRange", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)</p><p><b> {&
34、lt;/b></p><p> if(strstr((char*)szData, "ethernet") != NULL)// 判斷是不是以太網卡</p><p><b> {</b></p><p> dwBufSize = 256;</p><p> if(RegQueryVa
35、lueEx(hSubKey, "DriverDesc", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)</p><p><b> {</b></p><p> ADAPTER_INFO *pAI = new ADAPTER_INFO;</p><p
36、> pAI->strDriverDesc = (LPCTSTR)szData;</p><p> dwBufSize = 256;</p><p> if(RegQueryValueEx(hSubKey, "NetCfgInstanceID", 0, &dwDataType, szData, &dwBufSize) == ERROR_S
37、UCCESS)</p><p><b> {</b></p><p> pAI->strS = (LPCTSTR)szData;</p><p> RegGetIP(pAI, (LPCTSTR)szData);</p><p><b> }</b></p><p&g
38、t; AdapterInfoVector.push_back(pAI); // 加入到容器中</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> RegCloseKey(hNdiIn
39、tKey);</p><p><b> }</b></p><p> RegCloseKey(hSubKey);</p><p><b> }</b></p><p> dwBufSize = 256;</p><p> } /* end of while *
40、/</p><p> RegCloseKey(hKey);</p><p> return true;</p><p><b> }</b></p><p> // 得到注冊表中的IP信息</p><p> BOOL RegGetIP(ADAPTER_INFO *pAI, LPCT
41、STR lpszAdapterName, int nIndex/* =0 */)</p><p><b> {</b></p><p> HKEY hKey, hSubKey, hNdiIntKey;</p><p> string strKeyName = "SYSTEM\\CurrentControlSet\\Service
42、s\\Tcpip\\Parameters\\Interfaces\\";</p><p> strKeyName += lpszAdapterName;</p><p> if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,</p><p> strKeyName.c_str(),0,KEY_READ,</p><
43、;p> &hKey) != ERROR_SUCCESS)</p><p> return FALSE;</p><p> unsigned char szData[256];</p><p> DWORD dwDataType, dwBufSize;</p><p> dwBufSize = 256;</p>
44、;<p> if(RegQueryValueEx(hKey, "DhcpIPAddress", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)</p><p> pAI->strIP = (LPCTSTR)szData;</p><p><b> else{&
45、lt;/b></p><p> if(RegQueryValueEx(hKey, "IPAddress", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)</p><p> pAI->strIP = (LPCTSTR)szData;</p><p><
46、;b> }</b></p><p> dwBufSize = 256;</p><p> if(RegQueryValueEx(hKey, "DhcpSubnetMask", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)</p><p> pA
47、I->strNetMask = (LPCTSTR)szData;</p><p><b> else</b></p><p><b> {</b></p><p> if(RegQueryValueEx(hKey, "SubnetMask", 0, &dwDataType, szDa
48、ta, &dwBufSize) == ERROR_SUCCESS)</p><p> pAI->strNetMask = (LPCTSTR)szData;</p><p><b> }</b></p><p> dwBufSize = 256;</p><p> if(RegQueryValueEx
49、(hKey, "DhcpDefaultGateway", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)</p><p> pAI->strNetGate = (LPCTSTR)szData;</p><p><b> else</b></p>&l
50、t;p><b> {</b></p><p> if(RegQueryValueEx(hKey, "DefaultGateway", 0, &dwDataType, szData, &dwBufSize) == ERROR_SUCCESS)</p><p> pAI->strNetGate = (LPCTSTR)s
51、zData;</p><p><b> }</b></p><p> RegCloseKey(hKey);</p><p> strKeyName = "SYSTEM\\ControlSet001\\Control\\Network";</p><p> if(RegOpenKeyEx(HKE
52、Y_LOCAL_MACHINE,strKeyName.c_str(),0,</p><p> KEY_READ,&hKey) != ERROR_SUCCESS)</p><p> return FALSE;</p><p> char szSubKey[256];</p><p> char szSubKey_two[256]
53、;</p><p> memset(szSubKey, 0, 256);</p><p> DWORD dwIndex = 0;</p><p> DWORD dwIndex_two = 0;</p><p> dwBufSize = 256;</p><p> DWORD dwBufSize_two = 2
54、56;</p><p> pAI->strName = pAI->strDriverDesc;</p><p> while(RegEnumKey(hKey, dwIndex++, szSubKey, dwBufSize) == ERROR_SUCCESS)</p><p><b> {</b></p><
55、p> string strKeyName_two;</p><p> strKeyName_two = strKeyName + "\\";</p><p> strKeyName_two += szSubKey;</p><p> if(RegOpenKeyEx(hKey, szSubKey, 0, KEY_READ, &
56、;hSubKey) == ERROR_SUCCESS)</p><p><b> {</b></p><p> while(RegEnumKey(hSubKey, dwIndex_two++, szSubKey_two, dwBufSize_two) == ERROR_SUCCESS)</p><p><b> {</b&
57、gt;</p><p> if (strstr(szSubKey_two, lpszAdapterName) != NULL)</p><p><b> {</b></p><p> strcat(szSubKey_two, "\\Connection");</p><p> if(RegOp
58、enKeyEx(hSubKey, szSubKey_two, 0, KEY_READ, &hNdiIntKey) == ERROR_SUCCESS)</p><p><b> {</b></p><p> if(RegQueryValueEx(hNdiIntKey, "Name", 0, &dwDataType, szData,
59、 &dwBufSize) == ERROR_SUCCESS)</p><p><b> {</b></p><p> pAI->strName = (LPCTSTR)szData;</p><p><b> break;</b></p><p><b> }</
60、b></p><p> RegCloseKey(hNdiIntKey);</p><p> } </p><p><b> }</b></p><p><b> }</b></p><p> RegCloseKey(hS
61、ubKey);</p><p><b> }</b></p><p><b> }</b></p><p> RegCloseKey(hKey); </p><p> return TRUE;</p><p><b> }</b></p&
62、gt;<p> (三)添加和刪除IP</p><p> 圖5.添加和刪除新的IP</p><p> 本功能實現(xiàn)的是在本地IP地址列表中添加新的IP地址,然后刪除新添加的IP地址,</p><p> 實現(xiàn)對IP列表的管理。添加成功會出現(xiàn)“IPv4 address was successfully added.”</p>&l
63、t;p> 的語句,刪除成功會出現(xiàn)“IPv4 address was successfully deleted.”的語句。具</p><p><b> 體的代碼實現(xiàn)如下:</b></p><p> int main( )</p><p><b> {</b></p><p>
64、 /* Variables used by GetIpAddrTable */</p><p> PMIB_IPADDRTABLE pIPAddrTable;</p><p> DWORD dwSize = 0;</p><p> DWORD dwRetVal = 0;</p><p> IN_ADDR IPAddr;</p&g
65、t;<p> DWORD ifIndex;</p><p> UINT iaIPAddress;</p><p> UINT imIPMask;</p><p> /* IPv4 address and subnet mask we will be adding */ </p><p> iaIPAddress = i
66、net_addr("192.168.0.17");</p><p> imIPMask = inet_addr("255.255.255.0");</p><p> /* Variables where handles to the added IP are returned */</p><p> ULONG NTEC
67、ontext = 0;</p><p> ULONG NTEInstance = 0;</p><p> /* Variables used to return error message */</p><p> LPVOID lpMsgBuf;</p><p> // Before calling AddIPAddress we u
68、se GetIpAddrTable to get</p><p> // an adapter to which we can add the IP.</p><p> pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));</p><p> if (pIPAddrTable =
69、= NULL) </p><p><b> {</b></p><p> printf("Error allocating memory needed to call GetIpAddrTable\n");</p><p><b> return 0;</b></p><p&g
70、t;<b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> dwSize = 0;</p><p> // Make an initial call to GetIpAddrTable to get
71、the</p><p> // necessary size into the dwSize variable</p><p> if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==</p><p> ERROR_INSUFFICIENT_BUFFER)</p><p><b>
72、; {</b></p><p> FREE(pIPAddrTable);</p><p> pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);</p><p><b> }</b></p><p> if (pIPAddrTable == NULL)
73、 </p><p><b> {</b></p><p> printf("Memory allocation failed for GetIpAddrTable\n");</p><p><b> return 0;</b></p><p><b> }<
74、;/b></p><p><b> }</b></p><p> // Make a second call to GetIpAddrTable to get the</p><p> // actual data we want</p><p> if ((dwRetVal = GetIpAddrTabl
75、e(pIPAddrTable, &dwSize, 0)) == NO_ERROR) </p><p><b> {</b></p><p> // Save the interface index to use for adding an IP address</p><p> ifIndex = pIPAddrTable->
76、;table[0].dwIndex;</p><p> printf("\n\tInterface Index:\t%ld\n", ifIndex);</p><p> IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[0].dwAddr;</p><p> printf("
77、\tIP Address: \t%s (%lu%)\n", inet_ntoa(IPAddr),</p><p> pIPAddrTable->table[0].dwAddr);</p><p> IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[0].dwMask;</p><p&
78、gt; printf("\tSubnet Mask: \t%s (%lu%)\n", inet_ntoa(IPAddr),</p><p> pIPAddrTable->table[0].dwMask);</p><p> IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[0].dwBCast
79、Addr;</p><p> printf("\tBroadCast Address:\t%s (%lu%)\n", inet_ntoa(IPAddr),</p><p> pIPAddrTable->table[0].dwBCastAddr);</p><p> printf("\tReassembly size: \t%
80、lu\n\n",</p><p> pIPAddrTable->table[0].dwReasmSize);</p><p><b> } </b></p><p><b> else </b></p><p><b> {</b></p>
81、<p> printf("Call to GetIpAddrTable failed with error %d.\n", dwRetVal);</p><p> if (pIPAddrTable)</p><p> FREE(pIPAddrTable);</p><p><b> return 0;</b&g
82、t;</p><p><b> }</b></p><p> if (pIPAddrTable) </p><p><b> {</b></p><p> FREE(pIPAddrTable);</p><p> pIPAddrTable = NULL;</p
83、><p><b> }</b></p><p> if ((dwRetVal = AddIPAddress(iaIPAddress,</p><p> imIPMask ,</p><p><b> ifIndex,</b></p><p> &NTEConte
84、xt, &NTEInstance)) == NO_ERROR) </p><p><b> {</b></p><p> printf("\tIPv4 address was successfully added.\n");</p><p><b> } </b></p>&
85、lt;p><b> else </b></p><p><b> {</b></p><p> printf("AddIPAddress failed with error: %d\n", dwRetVal);</p><p> if (FormatMessage(FORMAT_MESSA
86、GE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language</p><p> (LPTSTR) & lpMsgBuf, 0, NULL
87、)) </p><p><b> {</b></p><p> printf("\tError: %s", lpMsgBuf);</p><p> LocalFree(lpMsgBuf);</p><p><b> return 0;</b></p><
88、;p><b> }</b></p><p><b> }</b></p><p> //刪除剛利用NTEContext所添加的IP地址</p><p> // variable where the handle was returned </p><p> if ((dw
89、RetVal = DeleteIPAddress(NTEContext)) == NO_ERROR)</p><p><b> {</b></p><p> printf("\tIPv4 address was successfully deleted.\n");</p><p><b> } </b&
90、gt;</p><p><b> else</b></p><p><b> {</b></p><p> printf("\tDeleteIPAddress failed with error: %d\n", dwRetVal);</p><p><b> r
91、eturn 0;</b></p><p><b> }</b></p><p><b> getch();</b></p><p><b> return 0;</b></p><p><b> }</b></p><
92、;p> ?。ㄋ模┇@取當前路由信息</p><p><b> 圖6.獲取路由信息</b></p><p> 本功能實現(xiàn)的是獲取當前所有活動的路由信息,并且打印出來,打印結果如圖所示,打印內容包括了網絡地址,網關,默認網關,下一跳等。具體的實現(xiàn)代碼如下:</p><p> void PrintIpForwardTable()</p
93、><p><b> {</b></p><p> PMIB_IPFORWARDTABLE pIpRouteTable = MyGetIpForwardTable(TRUE);</p><p> if(pIpRouteTable != NULL)</p><p><b> {</b></p&
94、gt;<p> DWORD i, dwCurrIndex;</p><p> struct in_addr inadDest;</p><p> struct in_addr inadMask;</p><p> struct in_addr inadGateway; </p><p> PMIB_IPADDRTAB
95、LE pIpAddrTable = NULL;</p><p> char szDestIp[128];</p><p> char szMaskIp[128];</p><p> char szGatewayIp[128];</p><p> printf("Active Routes:\n\n");</p
96、><p> printf(" Network Address Netmask Gateway Address Interface Metric\n");</p><p> for (i = 0; i < pIpRouteTable->dwNumEntries; i++)</p><p><b
97、> {</b></p><p> dwCurrIndex = pIpRouteTable->table[i].dwForwardIfIndex;</p><p><b> // 目的地址</b></p><p> inadDest.s_addr = pIpRouteTable->table[i].dwFor
98、wardDest;</p><p><b> // 子網掩碼</b></p><p> inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;</p><p><b> // 網關地址</b></p><p> inadGate
99、way.s_addr = pIpRouteTable->table[i].dwForwardNextHop;</p><p> strcpy(szDestIp, inet_ntoa(inadDest));</p><p> strcpy(szMaskIp, inet_ntoa(inadMask));</p><p> strcpy(szGatewayIp
100、, inet_ntoa(inadGateway));</p><p> printf(" %15s %16s %16s %16d %7d\n", </p><p> szDestIp, </p><p> szMaskIp, </p><p> szGatewayIp, </p><p>
101、 pIpRouteTable->table[i].dwForwardIfIndex,// 可以在此調用GetIpAddrTable獲取索引對應的IP地址</p><p> pIpRouteTable->table[i].dwForwardMetric1);</p><p><b> }</b></p><p> MyFre
102、eIpForwardTable(pIpRouteTable);</p><p><b> }</b></p><p><b> }</b></p><p> PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder)</p><p><b&g
103、t; {</b></p><p> PMIB_IPFORWARDTABLE pIpRouteTab = NULL;</p><p> DWORD dwActualSize = 0;</p><p> // 查詢所需緩沖區(qū)的大小</p><p> if(::GetIpForwardTable(pIpRouteTab, &a
104、mp;dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)</p><p><b> {</b></p><p> // 為MIB_IPFORWARDTABLE結構申請內存</p><p> pIpRouteTab = (PMIB_IPFORWARDTABLE)::GlobalAlloc(
105、GPTR, dwActualSize);</p><p><b> // 獲取路由表</b></p><p> if(::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)</p><p> return pIpRouteTab;</p>
106、<p> ::GlobalFree(pIpRouteTab);</p><p><b> }</b></p><p> return NULL;</p><p><b> }</b></p><p> void MyFreeIpForwardTable(PMIB_IPFORW
107、ARDTABLE pIpRouteTab)</p><p><b> {</b></p><p> if(pIpRouteTab != NULL)</p><p> ::GlobalFree(pIpRouteTab);</p><p><b> }</b></p><p&
108、gt;<b> (五)修改默認網關</b></p><p><b> 圖7.修改默認網關</b></p><p> 本功能實現(xiàn)的是修改默認網關的功能,修改失敗會提示失敗,修改成功會提示如圖5,并打印出新的默認網關的地址。具體代碼如下:</p><p> int main()</p><p>
109、<b> {</b></p><p><b> // 新網關地址</b></p><p> DWORD dwNewGateway = ::inet_addr("192.168.0.1");</p><p> // 在表中查找我們想要的入口。默認網關的目的地址為0.0.0.0</p>
110、<p> PMIB_IPFORWARDTABLE pIpRouteTable = MyGetIpForwardTable(TRUE);</p><p> PMIB_IPFORWARDROW pRow = NULL;</p><p> if(pIpRouteTable != NULL)</p><p><b> {</b>&l
111、t;/p><p> for(DWORD i=0; i<pIpRouteTable->dwNumEntries; i++)</p><p><b> {</b></p><p> if(pIpRouteTable->table[i].dwForwardDest == 0)// 找到了默認網關</p><p
112、><b> {</b></p><p> // 申請內存來保存這個入口。</p><p> // 這比自己填充MIB_IPFORWARDROW結構簡單許多,我們僅需要改變網關地址</p><p> if(pRow == NULL)</p><p><b> {</b></p&g
113、t;<p> pRow = (PMIB_IPFORWARDROW)::GlobalAlloc(GPTR, sizeof(MIB_IPFORWARDROW));</p><p> memcpy(pRow, &pIpRouteTable->table[i], sizeof(MIB_IPFORWARDROW));</p><p><b> }</
114、b></p><p> // 刪除舊的默認網關入口</p><p> if(::DeleteIpForwardEntry(&pIpRouteTable->table[i]) != ERROR_SUCCESS)</p><p><b> {</b></p><p> printf("C
115、ould not delete old gateway \n");</p><p><b> exit(1);</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b><
116、;/p><p> MyFreeIpForwardTable(pIpRouteTable);</p><p><b> }</b></p><p> if(pRow != NULL)</p><p><b> {</b></p><p> // 設置dwForwardNe
117、xtHop域為我們的新網關,所有其它的路由屬性將和先前的相同</p><p> pRow->dwForwardNextHop = dwNewGateway;</p><p> // 為默認網關創(chuàng)建新的路由入口</p><p> if(::SetIpForwardEntry(pRow) == NO_ERROR)</p><p>&l
118、t;b> {</b></p><p> printf(" Gateway changed successfully \n");</p><p> printf(" The New Gateway is:192.168.0.1 \n");</p><p><b> }</b><
119、;/p><p><b> else</b></p><p> printf(" SetIpForwardEntry() failed \n");</p><p> ::GlobalFree(pRow);</p><p><b> }</b></p><p&
120、gt;<b> getch();</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> PMIB_IPFORWARDTABLE MyGetIpForwardTable(BOOL bOrder)</p><p&g
121、t;<b> {</b></p><p> PMIB_IPFORWARDTABLE pIpRouteTab = NULL;</p><p> DWORD dwActualSize = 0;</p><p> // 查詢所需緩沖區(qū)的大小</p><p> if(::GetIpForwardTable(pIpRou
122、teTab, &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)</p><p><b> {</b></p><p> // 為MIB_IPFORWARDTABLE結構申請內存</p><p> pIpRouteTab = (PMIB_IPFORWARDTABLE)::Glo
123、balAlloc(GPTR, dwActualSize);</p><p><b> // 獲取路由表</b></p><p> if(::GetIpForwardTable(pIpRouteTab, &dwActualSize, bOrder) == NO_ERROR)</p><p> return pIpRouteTab;&
124、lt;/p><p> ::GlobalFree(pIpRouteTab);</p><p><b> }</b></p><p> return NULL;</p><p><b> }</b></p><p> void MyFreeIpForwardTable(PM
125、IB_IPFORWARDTABLE pIpRouteTab)</p><p><b> {</b></p><p> if(pIpRouteTab != NULL)</p><p> ::GlobalFree(pIpRouteTab);</p><p><b> }</b></p>
126、;<p> ?。┇@取網絡適配器列表</p><p> 圖8.獲取網絡適配器列表</p><p> 本功能實現(xiàn)的是獲取網絡適配器列表并打印其屬性信息,打印的信息包括了適配器名字,適配器目錄和適配器數目。具體的代碼如下:</p><p> int main()</p><p><b> {</b>&
127、lt;/p><p> PIP_INTERFACE_INFO pInfo = </p><p> (PIP_INTERFACE_INFO)::GlobalAlloc(GPTR, sizeof(IP_INTERFACE_INFO));</p><p> ULONG ulOutBufLen = sizeof(IP_INTERFACE_INFO);</p>
128、<p> // 如果上面申請的內存不夠的話,再重新申請</p><p> if(::GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER)</p><p><b> {</b></p><p> ::GlobalFree(pInfo);&l
129、t;/p><p> pInfo = (PIP_INTERFACE_INFO)::GlobalAlloc(GPTR, ulOutBufLen);</p><p><b> }</b></p><p> // 再次調用GetInterfaceInfo來獲取我們實際需要的數據</p><p> if(::GetInterf
130、aceInfo(pInfo, &ulOutBufLen) == NO_ERROR)</p><p><b> {</b></p><p> printf(" \tAdapter Name: %ws\n", pInfo->Adapter[0].Name);</p><p> printf(" \t
131、Adapter Index: %ld\n", pInfo->Adapter[0].Index);</p><p> printf(" \tNum Adapters: %ld\n", pInfo->NumAdapters);</p><p><b> }</b></p><p><b>
132、else</b></p><p><b> {</b></p><p> printf(" GetInterfaceInfo() failed \n");</p><p><b> }</b></p><p> ::GlobalFree(pInfo);<
133、/p><p><b> getch();</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 六.設計總結</b></p><p> 本次設計讓我學會了
134、使用winsock進行網絡的通信編程。本設計是基于c++的,讓我又重新溫習了一遍c++的知識,并對winsock有了具體的深刻的了解。設計中,遇到了很多的問題和不足,如功能的實現(xiàn)不完善,有些功能的方法寫錯了,缺失頭文件等。但在堅持不懈的努力下,查找了許多資料,也上網搜索了許多解決的方法,在諸多的嘗試后,終于一一解決了這些問題。但是本設計還是有很多不完善的地方,比如沒有一個完整的界面實現(xiàn),程序功能不完善等。這次設計讓我知道了實踐出真知,也
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網絡通信winsock課程設計--ip地址管理程序
- 網絡通信課程設計
- 網絡通信課程設計--公寓網絡設計
- 基于tcpip協(xié)議的網絡通信應用程序課程設計報告
- 測控網絡通信系統(tǒng)及人機交互接口設計 課程設計
- java課程設計報告--“即時通”網絡通信系統(tǒng)的設計與開發(fā)
- vc++課程設計----用winsock實現(xiàn)聊天
- 網絡通信呼叫中心詳細設計
- 基于gui的網絡通信程序設計
- devicenet網絡配置與通信驗證課程設計
- 網絡通信基站施工方案
- 網絡通信之要約研究.pdf
- 通信課程設計---哈佛幼兒園網絡的設計
- 千兆網絡通信系統(tǒng)的FPGA設計實現(xiàn).pdf
- 基于FPGA的硬件千兆網絡通信設計.pdf
- [學習]網絡程序設計-03-winsock編程詳解-udp通信編程-v
- 《網絡通信的工作原理》教學設計與反思
- 通信原理課程設計
- 移動通信 課程設計
- 通信綜合課程設計
評論
0/150
提交評論