获取网络设备信息的win32程序

       这几天一直搞了好久!才基本上完成了这个程序的基本功能!但是,由于滚动条的技术很落后!所以,程序的运行效率很低!很耗内存!正在改进用新的滚动条技术。

       发现写win32程序的时候一定要注意ASCII和UNICODE两种编码的混用。这是件非常头痛的事情!所以,发现输出为乱码时!要考虑看是不是这个问题!在运行该程序前务必在  项目->属性 页面里面把 使用unicode  改成为未设置。

程序如下:

 

#include "StdAfx.h"
#include <iostream>
#include <windows.h>
//#include "IPHlpApi.h"
//#include "Iphlpapi.h"
#include "Iphlpapi.h"
#include <string.h>
#include <stdio.h>
#pragma comment(lib,"Iphlpapi.lib")
#define WINVER 0x0500
//
#define MAXNUM 100
typedef struct InFo
{
 int count;
 TCHAR * info[MAXNUM];
}information;
//
information MyGetInterfaceInfo(bool bOrder);
information MyGetNetworkParams(bool bOrder);
information MyGetAdaptersInfo(bool bOrder);
information MyGetIfTable(bool bOrder);
information MyGetIpAddrTable(bool bOrder);
information  MyGetTcpTable(bool bOrder);
//
int iVscrollPos=0;

using namespace std;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("SysMets2") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }

     hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"),
                          WS_OVERLAPPEDWINDOW | WS_VSCROLL,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}


LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static int  cxChar, cxCaps, cyChar, cyClient;
     HDC         hdc ;
     int         i, y ;
     PAINTSTRUCT ps ;
     TCHAR       szBuffer[10] ;
     TEXTMETRIC  tm ;
  static int AllRow;
     information infoAll[MAXNUM];
  infoAll[0]=MyGetInterfaceInfo(TRUE);
  infoAll[1]=MyGetNetworkParams(TRUE);
  infoAll[2]=MyGetAdaptersInfo(TRUE);
  infoAll[3]=MyGetIpAddrTable(TRUE);
  infoAll[4]=MyGetIfTable(TRUE);
  infoAll[5]=MyGetTcpTable(TRUE);

     AllRow=infoAll[0].count+infoAll[1].count+infoAll[2].count+infoAll[3].count+infoAll[4].count+infoAll[5].count;

     switch (message)
     {
     case WM_CREATE:
          hdc = GetDC (hwnd) ;
          GetTextMetrics (hdc, &tm) ;
          cxChar = tm.tmAveCharWidth ;
          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
          cyChar = tm.tmHeight + tm.tmExternalLeading ;
          ReleaseDC (hwnd, hdc) ;
 
    SetScrollRange(hwnd,SB_VERT,0,AllRow-1,FALSE);
    SetScrollPos(hwnd,SB_VERT,0,TRUE);
          return 0 ;
   
     case WM_SIZE:
          cyClient = HIWORD (lParam) ;
          return 0 ;
  case WM_VSCROLL:
   switch(LOWORD(wParam))
   {
   case SB_LINEUP:
    iVscrollPos--;
    break;
   case SB_LINEDOWN:
    iVscrollPos++;
    break;
   case SB_PAGEUP:
    iVscrollPos-=cyClient/cyChar;
    break;
   case SB_PAGEDOWN:
    iVscrollPos+=cyClient/cyChar;
    break;
   case SB_THUMBTRACK://SB_THUMBPOSITION:
    iVscrollPos=HIWORD(wParam);
    break;
   default:
    break;
   }
   iVscrollPos=max(0,min(iVscrollPos,AllRow-1));
   if(iVscrollPos!=::GetScrollPos(hwnd,SB_VERT))
   {
    SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
    ::InvalidateRect(hwnd,NULL,TRUE);
   }

  
   return 0;


     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
    MyGetInterfaceInfo(TRUE);
    for(int i=0;i<infoAll[0].count;++i)
    {
    ::TextOut(hdc,0,i*cyChar-iVscrollPos*cyChar,infoAll[0].info[i],::lstrlen(infoAll[0].info[i]));
    }
    for(int i=0;i<infoAll[1].count;++i)
    {
     ::TextOut(hdc,0,infoAll[0].count*cyChar+i*cyChar-
      iVscrollPos*cyChar,infoAll[1].info[i],::lstrlen(infoAll[1].info[i]));
    }
    for(int i=0;i<infoAll[2].count;++i)
    {
     ::TextOut(hdc,0,infoAll[0].count*cyChar+infoAll[1].count*cyChar+
      i*cyChar-iVscrollPos*cyChar,infoAll[2].info[i],::lstrlen(infoAll[2].info[i]));
    }
    for(int i=0;i<infoAll[3].count;++i)
    {
     ::TextOut(hdc,0,infoAll[0].count*cyChar+infoAll[1].count*cyChar+
      infoAll[2].count*cyChar+i*cyChar-iVscrollPos*cyChar,infoAll[3].info[i],::lstrlen(infoAll[3].info[i]));
    }
    for(int i=0;i<infoAll[4].count;++i)
    {
     ::TextOut(hdc,0,infoAll[0].count*cyChar+infoAll[1].count*cyChar
      +infoAll[2].count*cyChar+infoAll[3].count*cyChar+i*cyChar-
      iVscrollPos*cyChar,infoAll[4].info[i],::lstrlen(infoAll[4].info[i]));
    }
    for(int i=0;i<infoAll[5].count;++i)
    {
     ::TextOut(hdc,0,infoAll[0].count*cyChar+infoAll[1].count*cyChar
      +infoAll[2].count*cyChar+infoAll[3].count*cyChar+infoAll[4].count*cyChar+i*cyChar-
      iVscrollPos*cyChar,infoAll[5].info[i],::lstrlen(infoAll[5].info[i]));
    }
       
          EndPaint (hwnd, &ps) ;
          return 0 ;

     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
//##############################################################################//
//           调用MyGetInterfaceInfo获取网络相关信息的模块开始                   //
//            获取本系统网络适配器数以及每个网络适配器的索引                    //
//##############################################################################//
information MyGetInterfaceInfo(bool bOrder)
{
    PIP_INTERFACE_INFO pInfo;
 int i;
 ULONG    ulOutBufLen;//后面的函数调用时获取网络信息需要的缓冲区字节数
 DWORD    dwRetVal;
 ulOutBufLen = 0;
    information InfoAdapter;
 InfoAdapter.count=0;

 if ( GetInterfaceInfo(NULL, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER)// 第一次调用,目的是取得需要缓冲区的大小
 {
  pInfo = (IP_INTERFACE_INFO *) GlobalAlloc( GPTR, ulOutBufLen);//给pInfo分配ulOutBufLen这么大的内存
  if (pInfo == NULL)  //分配内存失败
  {
   printf("Unable to allocate memory needed to call GetInterfaceInfo/n");
  }
  else  //分配内存成功
  {
   dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);   //获取信息,并存入pInfo
   if (dwRetVal == NO_ERROR )//调用GetInterfaceInfo(pInfo, &ulOutBufLen)成功,且有适配器
   {
    //printf("/nNum Adapters: %ld/n/n", pInfo->NumAdapters);//输出网络适配器的数目
    
    InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("适配器的数目: %ld"),pInfo->NumAdapters);
    InfoAdapter.count++;
    for (i=0; i < (int) pInfo->NumAdapters; i++)  //依次输出每个网络适配器的信息
    {
    // cout<<"Adapter Index["<<i<<"]:"<<pInfo->Adapter[i].Index<<endl;
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("适配器的索引: %ld"),pInfo->Adapter[i].Index);
     InfoAdapter.count++;
    // cout<<"Adapter Name["<<i<<"]:"<<pInfo->Adapter[i].Name<<endl;
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("适配器的名字: %s"),pInfo->Adapter[i].Name);

     InfoAdapter.count++;
    }
   }
   
   else if (dwRetVal == ERROR_NO_DATA)//调用GetInterfaceInfo(pInfo, &ulOutBufLen)成功,但是没有适配器
   {
    cout<<"There are no network adapters with IPv4 enabled on the local system/n";
   }
   else//调用GetInterfaceInfo(pInfo, &ulOutBufLen)失败
   {
    cout<<"GetInterfaceInfo failed with error:"<<dwRetVal<<"/n";
    LPVOID lpMsgBuf;
    if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
     NULL,dwRetVal,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
     (LPTSTR) &lpMsgBuf,0,NULL ))
    {
     cout<<"/tError: "<<lpMsgBuf;
     LocalFree( lpMsgBuf );//释放FormatMessage执行时动态分配的内容
    }    
   }
   GlobalFree(pInfo);//释放pInfo的内存空间
  }
 }
 else//获取缓冲区大小出错
 {
  printf("/n调用GetInterfaceInfo函数获取网络需求缓冲区信息有错");
 }
 return InfoAdapter;
}
//##################################################//
//  调用MyGetInterfaceInfo获取网络相关信息的模块结束//
//     释放类型为PMIB_TCPTABLE实参的内存空间        //
//##################################################//


//##############################################################################//
//           调用MyGetNetworkParams获取网络相关信息的模块开始                   //
//              获取主机名,主机域名,DNS服务器IP地址信息                       //
//##############################################################################//
information MyGetNetworkParams(bool bOrder)
{
    FIXED_INFO * FixedInfo;
 IP_ADDR_STRING * pIPAddr;
 ULONG ulOutBufLen =0;
 DWORD    dwRetVal;
    information InfoDns;
 InfoDns.count=0;

 if( ERROR_BUFFER_OVERFLOW == GetNetworkParams(NULL, &ulOutBufLen ) )//获取FixedInfo需要的内存大小,并存储到ulOutBufLen中
 {
  FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );//给FixedInfo分配ulOutBufLen大小的内存空间
  if(FixedInfo==0)//调用GlobalAlloc( GPTR, ulOutBufLen )函数失败
  {
   printf( "Unable to allocate memory needed to call GetNetworkParams/n");
  }
  else//调用GlobalAlloc( GPTR, ulOutBufLen )函数成功
  {
   dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen );//获取网络信息,并存储到FixedInfo
   if ( dwRetVal== ERROR_SUCCESS )//调用GetNetworkParams( FixedInfo, &ulOutBufLen )函数成功
   {//输出各种网络信息
//      printf( "/nHost Name: %s", FixedInfo -> HostName );
    InfoDns.info[InfoDns.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoDns.info[InfoDns.count],TEXT("主机名字: %s"),FixedInfo -> HostName);
    InfoDns.count++;
//    printf( "/nDomain Name: %s", FixedInfo -> DomainName );
    InfoDns.info[InfoDns.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoDns.info[InfoDns.count],TEXT("域名: %s"),FixedInfo -> DomainName);
    InfoDns.count++;
     
//    printf( "/nDNS Servers:" );
    InfoDns.info[InfoDns.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoDns.info[InfoDns.count],TEXT("DNS服务器:"),NULL);
    InfoDns.count++;
//    printf("/n/tDnsServer.IpAddress:%s", (FixedInfo -> DnsServerList).IpAddress.String);
    InfoDns.info[InfoDns.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoDns.info[InfoDns.count],TEXT("    DNS服务器的IP地址:%s"),(FixedInfo -> DnsServerList).IpAddress.String);
    InfoDns.count++;
//    printf("/n/tDnsServer.IpMask:%s", (FixedInfo -> DnsServerList).IpMask.String);
    InfoDns.info[InfoDns.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoDns.info[InfoDns.count],TEXT("    DNS服务器的掩码:%s"),(FixedInfo -> DnsServerList).IpMask.String);
    InfoDns.count++;
        
    pIPAddr = FixedInfo -> DnsServerList.Next;  //赋值IP信息给变量pIPAddr,因为用链表存储多个dns服务器信息
    while ( pIPAddr )//看是否已经到了链表的结尾
    {//输出ip信息
//     printf( "/n/n/tDnsServer.IpAddress:%s", pIPAddr ->IpAddress.String );
     InfoDns.info[InfoDns.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoDns.info[InfoDns.count],TEXT("    DNS服务器的IP地址:%s"),pIPAddr ->IpAddress.String);
     InfoDns.count++;
//     printf( "/n/tDnsServer.IpMask:%s", pIPAddr ->IpMask.String );
     InfoDns.info[InfoDns.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoDns.info[InfoDns.count],TEXT("    DNS服务器的掩码:%s"), pIPAddr ->IpMask.String);
     InfoDns.count++;
     pIPAddr = pIPAddr ->Next;
    }
   }
   else//调用GetNetworkParams( FixedInfo, &ulOutBufLen )函数失败
   {
    printf("/n调用GetNetworkParams函数获取网络信息有错");
    //exit(1);
   }
   GlobalFree(FixedInfo);
  }  
 }
 else//调用GetNetworkParams函数获取网络需求缓冲区信息有错
 {
  printf("/n调用GetNetworkParams函数获取网络需求缓冲区信息有错");
 } 
 return InfoDns;
}
//##################################################//
//  调用MyGetNetworkParams获取网络相关信息的模块结束//
//     释放类型为PMIB_TCPTABLE实参的内存空间        //
//##################################################//

 

//##############################################################################//
//            调用MyGetAdaptersInfo获取网络相关信息的模块开始                   //
//     获取适配器名字,适配器名字描述,IP地址,掩码,网关地址,DHCP服务器地址信息    //
//##############################################################################//
information MyGetAdaptersInfo(bool bOrder)
{
    IP_ADAPTER_INFO *pAdapterInfo=NULL,*ptempAdapterInfo=NULL;
 ULONG ulOutBufLen=0;
    information InfoAdapter;
 InfoAdapter.count=0;


 DWORD dwRetVal=GetAdaptersInfo(NULL,&ulOutBufLen);//调用GetAdaptersInfo函数获取网络需求缓冲区信息,并存到ulOutBufLen中
 if(dwRetVal==ERROR_BUFFER_OVERFLOW)//调用GetAdaptersInfo(NULL,&ulOutBufLen)成功
 {
  pAdapterInfo = (IP_ADAPTER_INFO *) GlobalAlloc( GPTR, ulOutBufLen);//给pAdapterInfo分配ulOutBufLen大小的内存空间
  if (pAdapterInfo == NULL)//调用 GlobalAlloc( GPTR, ulOutBufLen)失败
  {
   printf( "Unable to allocate memory needed to call GetAdaptersInfo/n");
  }
  else//调用 GlobalAlloc( GPTR, ulOutBufLen)成功
  {
   dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);//获取网络信息,并存储到pAdapterInfo
   if(dwRetVal==ERROR_SUCCESS)//调用GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)函数成功
   {
    ptempAdapterInfo=pAdapterInfo; //将ip信息赋值给中间量。因为采用链表方式存放ip信息,所以用中间变量读出所有ip信息
    while(ptempAdapterInfo!=NULL)
    {
//     printf("/nAdapterName:%s", ptempAdapterInfo->AdapterName);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("适配器名字: %s"),ptempAdapterInfo->AdapterName);
     InfoAdapter.count++;
//     printf("/nAdapterName Description:%s", ptempAdapterInfo->Description);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("适配器描述: %s"),ptempAdapterInfo->Description);
     InfoAdapter.count++;
//     printf("/n/tAddress:%s", (ptempAdapterInfo->IpAddressList).IpAddress.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("IP地址: %s"),(ptempAdapterInfo->IpAddressList).IpAddress.String);
     InfoAdapter.count++;
//     printf("/n/tIpMask:%s", (ptempAdapterInfo->IpAddressList).IpMask.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("IP掩码: %s"),(ptempAdapterInfo->IpAddressList).IpMask.String);
     InfoAdapter.count++;
//     printf("/n/tGatewayList.IpAddress:%s", (ptempAdapterInfo->GatewayList).IpAddress.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("网关IP地址: %s"),(ptempAdapterInfo->GatewayList).IpAddress.String);
     InfoAdapter.count++;
//     printf("/n/tGatewayList.IpMask:%s", (ptempAdapterInfo->GatewayList).IpMask.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("网关IP掩码: %s"),(ptempAdapterInfo->GatewayList).IpMask.String);
     InfoAdapter.count++;
//     printf("/n/tDhcpServer.IpAddress:%s", (ptempAdapterInfo->DhcpServer).IpAddress.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("DHCP服务器IP地址: %s"),(ptempAdapterInfo->DhcpServer).IpAddress.String);
     InfoAdapter.count++;
//     printf("/n/tDhcpServer.IpMask:%s", (ptempAdapterInfo->DhcpServer).IpMask.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("DHCP服务器IP掩码: %s"),(ptempAdapterInfo->DhcpServer).IpMask.String);
     InfoAdapter.count++;
//     printf("/n/tPrimaryWinsServer.IpAddress:%s", (ptempAdapterInfo->PrimaryWinsServer).IpAddress.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("PrimaryWinsServer.IpAddress: %s"),(ptempAdapterInfo->PrimaryWinsServer).IpAddress.String);
     InfoAdapter.count++;
//     printf("/n/tPrimaryWinsServer.IpMask:%s", (ptempAdapterInfo->PrimaryWinsServer).IpMask.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("PrimaryWinsServer.IpMask: %s"),(ptempAdapterInfo->PrimaryWinsServer).IpMask.String);
     InfoAdapter.count++;
//     printf("/n/tSecondaryWinsServer.IpAddress:%s", (ptempAdapterInfo->SecondaryWinsServer).IpAddress.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("SecondaryWinsServer.IpAddress: %s"),(ptempAdapterInfo->SecondaryWinsServer).IpAddress.String);
     InfoAdapter.count++;
//     printf("/n/tSecondaryWinsServer.IpMask:%s", (ptempAdapterInfo->SecondaryWinsServer).IpMask.String);
     InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
     ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("SecondaryWinsServer.IpMask: %s"),(ptempAdapterInfo->SecondaryWinsServer).IpMask.String);
     InfoAdapter.count++;

     ptempAdapterInfo=ptempAdapterInfo->Next;
    }    
   }
   else//调用GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)函数失败
   {
    printf("/n调用GetAdaptersInfo函数获取IP地址信息有错");
   }
   GlobalFree(pAdapterInfo);//释放pAdapterInfo的内存空间
  }
 }
 else//调用GetAdaptersInfo函数获取网络需求缓冲区信息失败
 {
  printf("/n调用GetAdaptersInfo函数获取网络需求缓冲区信息有错");
 } 
 return  InfoAdapter;
}
//##################################################//
//  调用MyGetAdaptersInfo获取网络相关信息的模块结束 //
//     获取适配器名字,适配器名字描述,IP地址,        //
//       掩码,网关地址,DHCP服务器地址信息           //
//##################################################//

 

//##############################################################################//
//            调用MyGetIpAddrTable获取网络适配器数信息开始                      //
//                        获取适配器相关的信息                                  //
//##############################################################################//
information MyGetIpAddrTable(bool bOrder)
{
     // Before calling AddIPAddress we use GetIpAddrTable to get
 // an adapter to which we can add the IP.
 PMIB_IPADDRTABLE pIPAddrTable;
 WORD dwRetVal;
    ULONG ulOutBufLen = 0;
 information InfoAdapter;
 InfoAdapter.count=0;
 
 // 第一次调用获取缓冲区需要的大小存在变量dwSize variable
 if (GetIpAddrTable(NULL, &ulOutBufLen , 0) == ERROR_INSUFFICIENT_BUFFER)
 {
  pIPAddrTable = (MIB_IPADDRTABLE *) GlobalAlloc ( GPTR, ulOutBufLen  );
  if ( pIPAddrTable )
  {// 第二次调用获取实际的数据,缓冲区的大小满足条件
   dwRetVal = GetIpAddrTable( pIPAddrTable, &ulOutBufLen , 0 );
   if ( dwRetVal == NO_ERROR )
   {
//    printf("/tAddress: %s/n", inet_ntoa(*(struct in_addr*)&pIPAddrTable->table[0].dwAddr));
    InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("Address: %s"),inet_ntoa(*(struct in_addr*)&pIPAddrTable->table[0].dwAddr));
    InfoAdapter.count++;
//    printf("/tMask:    %s/n", inet_ntoa(*(struct in_addr*)&pIPAddrTable->table[0].dwMask));
       InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("Mask: %s"),inet_ntoa(*(struct in_addr*)&pIPAddrTable->table[0].dwMask));
    InfoAdapter.count++;
//    printf("/tIndex:   %ld/n", pIPAddrTable->table[0].dwIndex);
       InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("Index: %ld"), pIPAddrTable->table[0].dwIndex);
    InfoAdapter.count++;
//    printf("/tBCast:   %ld/n", pIPAddrTable->table[0].dwBCastAddr);
       InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("BCast: %ld"), pIPAddrTable->table[0].dwBCastAddr);
    InfoAdapter.count++;
//    printf("/tReasm:   %ld/n", pIPAddrTable->table[0].dwReasmSize);
       InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("Reasm: %ld"),pIPAddrTable->table[0].dwReasmSize);
    InfoAdapter.count++;
   }
   else
   {
    printf("Call to GetIpAddrTable failed./n");
   }
  }
  else
  {
   printf( "Unable to allocate memory needed to call GetIfTable/n");
  }
 }
 else
  printf("/n调用GetIpAddrTable函数获取网络适配器信息有错");
 return InfoAdapter;
}
//##################################################//
//  调用MyGetIpAddrTable获取网络适配器数信息开始    //
//              获取适配器相关的信息                //
//##################################################//


//##############################################################################//
//            调用MyGetIfTable获取网络适配器数信息开始                          //
//     获取适配器相关的信息比较多,可以参考数据结构MIB_IFROW各个成员的含义      //
//##############################################################################//
information MyGetIfTable(bool bOrder)
{
    PMIB_IFTABLE ifTable=NULL;
 PMIB_IFROW pMibIfRow=NULL;
 ULONG ulOutBufLen = 0;
 WORD dwRetVal;
 information InfoAdapter;
 InfoAdapter.count=0;
 // Before calling GetIfEntry, we call GetIfTable to make
 // sure there are entries to get.
 // Make an initial call to GetIfTable to get the
 // necessary size into dwSize

 if (GetIfTable(NULL, &ulOutBufLen, 0) == ERROR_INSUFFICIENT_BUFFER)
 {     //  GlobalFree(ifTable);
  ifTable = (MIB_IFTABLE*) GlobalAlloc( GPTR, ulOutBufLen);
  if(ifTable==0)
  {
   printf( "Unable to allocate memory needed to call GetIfTable/n");
  }
  else
  {
   if ((dwRetVal = GetIfTable(ifTable, &ulOutBufLen, 0)) == NO_ERROR)
   {
//    printf("/nNumber of Local Adapter is %d",ifTable->dwNumEntries);
    InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("Number of Local Adapter is %d"),ifTable->dwNumEntries);
    InfoAdapter.count++;

    pMibIfRow = (MIB_IFROW*) GlobalAlloc( GPTR,sizeof(MIB_IFROW));
    if(pMibIfRow!=0)
    {
     for(int i=0;i<ifTable->dwNumEntries;i++)
     {
      pMibIfRow->dwIndex = i+1;
      if ((dwRetVal = GetIfEntry(pMibIfRow)) == NO_ERROR)
      {//MIB_IFROW结构里面包含的网络适配器的信息比较多,参考msdn
//       printf("/n/tDescription of Adapter[%d]: %s/n",i,pMibIfRow->bDescr);
       InfoAdapter.info[InfoAdapter.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoAdapter.info[InfoAdapter.count],TEXT("Description of Adapter[%d]:%s"),i,pMibIfRow->bDescr);
                InfoAdapter.count++;
      }
      else
      {
       printf("Call to GetIfEntry failed./n");
       // Here you can use FormatMessage to find out why
       // it failed.
      }
     }
     GlobalFree(pMibIfRow);
    }
    else
    {
     printf( "Unable to allocate memory needed to call GetIfEntry/n");
    }
   }
   else
   {
    printf("/n调用GetIfTable函数获取网络需求信息有错");
   }
   GlobalFree(ifTable);
  }
 }
 else
 {
  printf("/n调用GetIfTable函数获取网络需求缓冲区信息有错");
 }
 return InfoAdapter;

}
//##################################################//
//      调用MyGetIfTable获取网络适配器数信息结束    //
//      获取适配器相关的信息比较多,可以参考        //
//       数据结构MIB_IFROW各个成员的含义            //
//##################################################//
//##############################################################################//
//                     设计MyGetTcpTable函数模块开始                            //
//                       获取本系统网络适配器数                                 //
//##############################################################################//
information  MyGetTcpTable(bool bOrder)
{
 PMIB_TCPTABLE pTcpTable=NULL;
 DWORD dwActualSize=0;
 ULONG ulOutBufLen = 0;
 DWORD dwRetVal = 0;
 char szLocalAddr[128];
 char szRemoteAddr[128]; 
 struct in_addr IpAddr;
 information InfoTcp;
 InfoTcp.count=0;

 if(::GetTcpTable(NULL,&dwActualSize,bOrder)==ERROR_INSUFFICIENT_BUFFER)//这一次调用是为了获取实际需要多少内存缓冲区
 {
  if(pTcpTable=(PMIB_TCPTABLE)::GlobalAlloc(GPTR,dwActualSize))//给pTcpTable分配dwActualSize这么大的内存空间
  {
   if(::GetTcpTable(pTcpTable,&dwActualSize,bOrder)==NO_ERROR)//此处获取信息并且写到pTcpTable中
   {
 //   printf("/nTCP TABLE/tNumber of entries1: %ld",pTcpTable->dwNumEntries);
    InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("TCP TABLE   Number of entries1: %ld"),pTcpTable->dwNumEntries);
    InfoTcp.count++;
 //   printf("/n/t/tLoc Addr/tLoc Port/tRem Addr/tRem Port/tState");
    InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
    ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("Loc Addr   Loc Port   Rem Addr   Rem Port   State"),NULL);
    InfoTcp.count++;
    for (int i = 0; i<(int) pTcpTable->dwNumEntries; i++)//(int) pTcpTable->dwNumEntries
    {
     //
     IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;
   //  strcpy(szLocalAddr, inet_ntoa(IpAddr) );//此处使用这个函数会让程序变得很慢!原因正在查!
     IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr;
   //  strcpy(szRemoteAddr, inet_ntoa(IpAddr) );  //此处使用这个函数会让程序变得很慢!原因正在查!
     

 //    printf(" pTcpTable->dwNumEntries的值为2:%d",pTcpTable->dwNumEntries);
     
//     printf("/n/tTCP[%d]",i);
//     printf("/t%s",szLocalAddr);
//     printf("/t%d", ntohs(pTcpTable->table[i].dwLocalPort));
//     printf("/t%s", szRemoteAddr);
//     printf("/t%d", ntohs(pTcpTable->table[i].dwRemotePort));
//     printf("/t%ld:", pTcpTable->table[i].dwState);

     InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
        ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("pTcpTable->dwNumEntries的值为:%d"),pTcpTable->dwNumEntries);
     InfoTcp.count++;
/*
     InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
        ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("      TCP[%d]    %s    %d    %s    %d    %ld"),
      i,szLocalAddr,ntohs(pTcpTable->table[i].dwLocalPort),szRemoteAddr,
      ntohs(pTcpTable->table[i].dwRemotePort),pTcpTable->table[i].dwState);
     InfoTcp.count++;
*/
     InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
        ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("      TCP[%d]        %d        %d    %ld"),
      i,ntohs(pTcpTable->table[i].dwLocalPort),
      ntohs(pTcpTable->table[i].dwRemotePort),pTcpTable->table[i].dwState);
     InfoTcp.count++;

     switch (pTcpTable->table[i].dwState)
     {
      case MIB_TCP_STATE_CLOSED:
//       printf("CLOSED/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("CLOSED"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_LISTEN:
//       printf("LISTEN/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("LISTEN"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_SYN_SENT:
//       printf("SYN-SENT/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("SYN-SENT"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_SYN_RCVD:
//       printf("SYN-RECEIVED/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("SYN-RECEIVED"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_ESTAB:
//        printf("ESTABLISHED/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("ESTABLISHED"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_FIN_WAIT1:
//       printf("FIN-WAIT-1/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("FIN-WAIT-1"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_FIN_WAIT2:
//       printf("FIN-WAIT-2 /n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("FIN-WAIT-2"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_CLOSE_WAIT:
//       printf("CLOSE-WAIT/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("CLOSE-WAIT"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_CLOSING:
//       printf("CLOSING/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("CLOSING"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_LAST_ACK:
//       printf("LAST-ACK/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("LAST-ACK"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_TIME_WAIT:
//       printf("TIME-WAIT/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("TIME-WAIT"),NULL);
       InfoTcp.count++;
       break;
      case MIB_TCP_STATE_DELETE_TCB:
//       printf("DELETE-TCB/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("DELETE-TCB"),NULL);
       InfoTcp.count++;
       break;
      default:
//       printf("UNKNOWN dwState value/n");
       InfoTcp.info[InfoTcp.count]=(TCHAR*)malloc(MAXNUM*sizeof(TCHAR));
       ::wsprintf(InfoTcp.info[InfoTcp.count],TEXT("UNKNOWN dwState value"),NULL);
       InfoTcp.count++;
       break;
     }
    //::GlobalFree(pTcpTable);
    
    }
    ::GlobalFree(pTcpTable);
   }
   else
   {
    ::GlobalFree(pTcpTable);
    printf("/n获取信息并且写到pTcpTable中有错");
   }
  }
  else
  {
   printf("/n调用GlobalAlloc函数有错");
  }  
 }
 else
 {
  printf("/n调用GetInterfaceInfo函数获取网络需求缓冲区信息有错");
 } 
 return InfoTcp;
}
//##################################################//
//          设计MyGetTcpTable函数模块结束           //
//             获取本系统Tcp连接信息                //
//##################################################//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值