網(wǎng)絡(luò)通信winsock課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  目 錄</b></p><p>  設(shè)計(jì)目的...................................................................................................2</p><p>  二.功能介紹...............................

2、....................................................................2</p><p>  三.程序流程...................................................................................................2</p><p> 

3、 四.設(shè)計(jì)步驟...................................................................................................4</p><p>  詳細(xì)設(shè)計(jì)......................................................................................

4、.............4</p><p>  六.設(shè)計(jì)總結(jié)..................................................................................................17</p><p>  七.參考文獻(xiàn)................................................

5、..................................................17</p><p><b>  設(shè)計(jì)目的</b></p><p>  通過(guò)課程設(shè)計(jì),使學(xué)生理解和學(xué)會(huì)應(yīng)用winsock來(lái)進(jìn)行編程;使學(xué)生提高理論聯(lián)系實(shí)際解決實(shí)際問(wèn)題的能力;也使學(xué)生對(duì)基于c++的網(wǎng)絡(luò)通信編程進(jìn)行系統(tǒng)設(shè)計(jì)過(guò)程中的諸多具體問(wèn)題有感性的認(rèn)識(shí)和深入的理解;進(jìn)而

6、提高學(xué)生的學(xué)習(xí)興趣為其將來(lái)順利進(jìn)入畢業(yè)環(huán)節(jié)作必要的準(zhǔn)備。</p><p><b>  功能介紹</b></p><p> ?。?)配置文件支持功能:使用配置文件存儲(chǔ)程序配置信息。</p><p> ?。?)網(wǎng)絡(luò)參數(shù)管理功能:能夠管理網(wǎng)絡(luò)參數(shù),例如IP、機(jī)器名、掩碼和DNS等。(3)路由表管理功能:能夠查看和管理主機(jī)路由表?xiàng)l目。</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>  四.設(shè)計(jì)步驟</b></p><p>  1. 資料整理 </p><p>  2. 配置文件支持功能 </p><p>  3. 網(wǎng)絡(luò)參數(shù)管理功能 </p><

9、p>  4. 路由表管理功能</p><p><b>  五.詳細(xì)設(shè)計(jì)</b></p><p> ?。ㄒ唬┇@取本地網(wǎng)絡(luò)配置信息</p><p>  圖2.獲取本地網(wǎng)絡(luò)配置信息</p><p>  本功能實(shí)現(xiàn)的是查詢本地網(wǎng)絡(luò)的基本配置信息,包括了主機(jī)名,注冊(cè)域名,DNS服務(wù)器,獲取信息后打印出來(lái),如圖2,具體的代碼如

10、下:</p><p>  int main()</p><p><b>  {</b></p><p>  FIXED_INFO fi;</p><p>  ULONG ulOutBufLen = sizeof(fi)+100;</p><p>  // 獲取本地電腦的網(wǎng)絡(luò)參數(shù)</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>  // 主機(jī)名稱</b>

13、</p><p>  printf(" Host Name: %s \n", fi.HostName);</p><p>  // 電腦注冊(cè)的域名</p><p>  printf(" Domain Name: %s \n", fi.DomainName);</p><p>  // 打印出所有的DNS

14、服務(wù)器</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、(二)讀取網(wǎng)卡信息</b></p><p><b>  圖3.網(wǎng)卡信息</b></p><p><b>  圖4.網(wǎng)卡信息</b></p><p>  本功能實(shí)現(xiàn)的獲取本地網(wǎng)卡信息,打印出本地連接,無(wú)線連接,WiFi適配器等,具體的內(nèi)容如圖所示,主要代碼如下:</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; // 子網(wǎng)掩碼</p><p>  string strNetGate; // 網(wǎng)關(guān)</p><p>  string strBroadcastIp; // 廣播地址</p><p>  string

20、 strS; // 測(cè)試用的</p><p>  }ADAPTER_INFO;</p><p>  BOOL GetAdapterInfo();//獲取網(wǎng)絡(luò)適配器信息</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>  // 取得所有網(wǎng)卡信息&l

27、t;/p><p>  BOOL GetAdapterInfo()</p><p><b>  {</b></p><p>  // 這里的代碼適合WINDOWS2000,對(duì)于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)// 判斷是不是以太網(wǎng)卡</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>  // 得到注冊(cè)表中的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>  本功能實(shí)現(xiàn)的是在本地IP地址列表中添加新的IP地址,然后刪除新添加的IP地址,</p><p>  實(shí)現(xiàn)對(duì)IP列表的管理。添加成功會(huì)出現(xiàn)“IPv4 address was successfully added.”</p>&l

63、t;p>  的語(yǔ)句,刪除成功會(huì)出現(xiàn)“IPv4 address was successfully deleted.”的語(yǔ)句。具</p><p><b>  體的代碼實(shí)現(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> ?。ㄋ模┇@取當(dāng)前路由信息</p><p><b>  圖6.獲取路由信息</b></p><p>  本功能實(shí)現(xiàn)的是獲取當(dāng)前所有活動(dòng)的路由信息,并且打印出來(lái),打印結(jié)果如圖所示,打印內(nèi)容包括了網(wǎng)絡(luò)地址,網(wǎng)關(guān),默認(rèn)網(wǎng)關(guān),下一跳等。具體的實(shí)現(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>  // 子網(wǎng)掩碼</b></p><p>  inadMask.s_addr = pIpRouteTable->table[i].dwForwardMask;</p><p><b>  // 網(wǎng)關(guān)地址</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,// 可以在此調(diào)用GetIpAddrTable獲取索引對(duì)應(yīng)的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結(jié)構(gòu)申請(qǐng)內(nèi)存</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>  (五)修改默認(rèn)網(wǎng)關(guān)</b></p><p><b>  圖7.修改默認(rèn)網(wǎng)關(guān)</b></p><p>  本功能實(shí)現(xiàn)的是修改默認(rèn)網(wǎng)關(guān)的功能,修改失敗會(huì)提示失敗,修改成功會(huì)提示如圖5,并打印出新的默認(rèn)網(wǎng)關(guān)的地址。具體代碼如下:</p><p>  int main()</p><p>

109、<b>  {</b></p><p><b>  // 新網(wǎng)關(guān)地址</b></p><p>  DWORD dwNewGateway = ::inet_addr("192.168.0.1");</p><p>  // 在表中查找我們想要的入口。默認(rèn)網(wǎng)關(guān)的目的地址為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)// 找到了默認(rèn)網(wǎng)關(guān)</p><p

112、><b>  {</b></p><p>  // 申請(qǐng)內(nèi)存來(lái)保存這個(gè)入口。</p><p>  // 這比自己填充MIB_IPFORWARDROW結(jié)構(gòu)簡(jiǎn)單許多,我們僅需要改變網(wǎng)關(guān)地址</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>  // 刪除舊的默認(rèn)網(wǎng)關(guān)入口</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>  // 設(shè)置dwForwardNe

117、xtHop域?yàn)槲覀兊男戮W(wǎng)關(guān),所有其它的路由屬性將和先前的相同</p><p>  pRow->dwForwardNextHop = dwNewGateway;</p><p>  // 為默認(rèn)網(wǎng)關(guān)創(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結(jié)構(gòu)申請(qǐng)內(nèi)存</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> ?。┇@取網(wǎng)絡(luò)適配器列表</p><p>  圖8.獲取網(wǎng)絡(luò)適配器列表</p><p>  本功能實(shí)現(xiàn)的是獲取網(wǎng)絡(luò)適配器列表并打印其屬性信息,打印的信息包括了適配器名字,適配器目錄和適配器數(shù)目。具體的代碼如下:</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>  // 如果上面申請(qǐng)的內(nèi)存不夠的話,再重新申請(qǐng)</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>  // 再次調(diào)用GetInterfaceInfo來(lái)獲取我們實(shí)際需要的數(shù)據(jù)</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>  六.設(shè)計(jì)總結(jié)</b></p><p>  本次設(shè)計(jì)讓我學(xué)會(huì)了

134、使用winsock進(jìn)行網(wǎng)絡(luò)的通信編程。本設(shè)計(jì)是基于c++的,讓我又重新溫習(xí)了一遍c++的知識(shí),并對(duì)winsock有了具體的深刻的了解。設(shè)計(jì)中,遇到了很多的問(wèn)題和不足,如功能的實(shí)現(xiàn)不完善,有些功能的方法寫(xiě)錯(cuò)了,缺失頭文件等。但在堅(jiān)持不懈的努力下,查找了許多資料,也上網(wǎng)搜索了許多解決的方法,在諸多的嘗試后,終于一一解決了這些問(wèn)題。但是本設(shè)計(jì)還是有很多不完善的地方,比如沒(méi)有一個(gè)完整的界面實(shí)現(xiàn),程序功能不完善等。這次設(shè)計(jì)讓我知道了實(shí)踐出真知,也

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論