網絡通信winsock課程設計_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論