获取网络应用比较好的例子

// Description:

//          The following example retrieves the entries from the interface

//          table and prints some of the information available for that entry

//

// Link to ws2_32.lib

#include <winsock2.h>

#include <ws2tcpip.h>

// Link to Iphlpapi.lib

#include <iphlpapi.h>
#pragma comment ( lib, "iphlpapi.lib" )

#include <stdio.h>

#include <stdlib.h>

 

// Note: could also use malloc() and free()

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))

#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

int main()
{
 // Declare and initialize variables
 DWORD dwSize = 0;
 DWORD dwRetVal = 0;
 int i, j;
 // variables used for GetIfTable and GetIfEntry

 MIB_IFTABLE *pIfTable;
 MIB_IFROW *pIfRow;

 // Allocate memory for our pointers.
 pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
 if (pIfTable == NULL)
 {
  printf("Error allocating memory needed to call GetIfTable()!/n");
  exit (1);
 }
 else
  printf("Memory needed to call GetIfTable() has been allocated!/n");

 // Before calling GetIfEntry, we call GetIfTable to make

 // sure there are entries to get and retrieve the interface index.
 // Make an initial call to GetIfTable to get the necessary size into dwSize

 dwSize = sizeof (MIB_IFTABLE);
 if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)
 {
  printf("Not enough memory! Re-allocating.../n");
  FREE(pIfTable);
  pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
  if (pIfTable == NULL)
  {
   printf("Error allocating memory!/n");
   exit (1);
  }
  else
   printf("(Dummy) Memory allocated successfully!/n");
 }
 else
 {
  printf("GetIfTable() should be fine!/n");
 }

 // Make a second call to GetIfTable to get the actual data we want.

 if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR)
 {
  if (pIfTable->dwNumEntries > 0)
  {
   pIfRow = (MIB_IFROW *) MALLOC(sizeof (MIB_IFROW));
   if (pIfRow == NULL)
   {
    printf("Error allocating memory!/n");
    if (pIfTable != NULL)
    {
     FREE(pIfTable);
     pIfTable = NULL;
    }
    exit (1);

   }
   else
    printf("Memory allocated successfully for 2nd call!/n");

   printf("/n/tNumber of entries(pIfTable->dwNumEntries): %ld/n/n", pIfTable->dwNumEntries);
   for (i = 0; i < (int) pIfTable->dwNumEntries; i++)

   {
    pIfRow->dwIndex = pIfTable->table[i].dwIndex;

    if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR)
    {
     printf("/tIndex:/t %ld/n", pIfRow->dwIndex);

     printf("/tInterfaceName[%d]:/t ", i);
     if (pIfRow->wszName != NULL)
      printf("%ws", pIfRow->wszName);
     printf("/n");

     printf("/tDescription[%d]:/t ", i);
     for (j = 0; j < (int) pIfRow->dwDescrLen; j++)
      printf("%c", pIfRow->bDescr[j]);
     printf("/n");

     printf("/tType[%d]:/t ", i);
     switch (pIfRow->dwType)
     {
     case IF_TYPE_OTHER:
      printf("Other/n");
      break;
     case IF_TYPE_ETHERNET_CSMACD:
      printf("Ethernet/n");
      break;
     case IF_TYPE_ISO88025_TOKENRING:
      printf("Token Ring/n");
      break;
     case IF_TYPE_PPP:
      printf("PPP/n");
      break;
     case IF_TYPE_SOFTWARE_LOOPBACK:
      printf("Software Lookback/n");
      break;
     case IF_TYPE_ATM:
      printf("ATM/n");
      break;
     case IF_TYPE_IEEE80211:
      printf("IEEE 802.11 Wireless/n");
      break;
     case IF_TYPE_TUNNEL:
      printf("Tunnel type encapsulation/n");
      break;
     case IF_TYPE_IEEE1394:
      printf("IEEE 1394 Firewire/n");
      break;
     default:
      printf("Unknown type %ld/n", pIfRow->dwType);
      break;
     }
     printf("/tMtu[%d]:/t/t %ld/n", i, pIfRow->dwMtu);
     printf("/tSpeed[%d]:/t %ld/n", i, pIfRow->dwSpeed);

     printf("/tdwInOctets [%d]:/t %ld/n", i, pIfRow->dwInOctets ); //MIB_IFROW->dwPhysAddrLen(H)
     printf("/tdwOutOctets [%d]:/t %ld/n", i, pIfRow->dwOutOctets );


     printf("/tdwInUcastPkts(单一传播) [%d]:/t %ld/n", i, pIfRow->dwInUcastPkts);

     printf("/tPhysical Addr:/t ");

     if (pIfRow->dwPhysAddrLen == 0)

      printf("/n");

     for (j = 0; j < (int) pIfRow->dwPhysAddrLen; j++)
     {
      if (j == (pIfRow->dwPhysAddrLen - 1))
       printf("%.2X/n", (int) pIfRow->bPhysAddr[j]);
      else
       printf("%.2X-", (int) pIfRow->bPhysAddr[j]);
     }
     printf("/tAdmin Status[%d]:/t %ld/n", i, pIfRow->dwAdminStatus);
     printf("/tOper Status[%d]:/t ", i);
     switch (pIfRow->dwOperStatus)
     {
     case IF_OPER_STATUS_NON_OPERATIONAL:
      printf("(IF_OPER_STATUS_NON_OPERATIONAL)Non Operational/n");
      break;
     case IF_OPER_STATUS_UNREACHABLE:
      printf("(IF_OPER_STATUS_UNREACHABLE)Unreasonable/n");
      break;
     case IF_OPER_STATUS_DISCONNECTED:
      printf("(IF_OPER_STATUS_DISCONNECTED)Disconnected/n");
      break;
     case IF_OPER_STATUS_CONNECTING:
      printf("(IF_OPER_STATUS_CONNECTING)Connecting/n");
      break;
     case IF_OPER_STATUS_CONNECTED:
      printf("(IF_OPER_STATUS_CONNECTED)Connected/n");
      break;
     case IF_OPER_STATUS_OPERATIONAL:
      printf("(IF_OPER_STATUS_OPERATIONAL)Operational/n");
      break;
     default:
      printf("Unknown status %ld/n", pIfRow->dwAdminStatus);
      break;
     }
     printf("/n");
    }
    else
    {
     printf("GetIfEntry failed for index %d with error: %ld/n", i, dwRetVal);
     // Here you can use FormatMessage to find out why it failed
    }
   }
  }
  else
  {
   printf("/tGetIfTable failed with error: %ld/n", dwRetVal);
  }
 }   
 

 system("pause");
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值