WSAEnumProtocols的用法

来源:互联网 发布:三菱plc编程电缆 编辑:程序博客网 时间:2024/06/05 04:52
  1. #include <Winsock2.h>  
  2. #include <stdio.h>  
  3. #pragma comment(lib, "ws2_32.lib")  
  4.   
  5. void main(void)  
  6. {  
  7.      WSADATA wsaData;  
  8.      WSAStartup( MAKEWORD( 2, 2 ), &wsaData );  
  9.   
  10.      LPWSAPROTOCOL_INFO info = NULL;  
  11.      DWORD dwLen;  
  12.   
  13.      //因为info还未分配内存,第一次调用必定会失败,但能够得到dwLen的值  
  14.      if (SOCKET_ERROR == WSAEnumProtocols(NULL, info, &dwLen))  
  15.      {  
  16.          int iErrorCode = GetLastError();  
  17.          if (WSAENOBUFS != iErrorCode)  
  18.          {  
  19.              WSACleanup();  
  20.              return;  
  21.          }                  
  22.      }  
  23.   
  24.      if (dwLen > 0)  
  25.      {  
  26.   
  27.        //如果没有分配内存这一步,将会出错,只传递 &inof是没有用的,注意指针的用法  
  28.         info = (LPWSAPROTOCOL_INFO)GlobalAlloc(GPTR, dwLen);  
  29.          if (info == NULL)  
  30.          {  
  31.              printf("Allocate memory failed! ErrorCode is %d", GetLastError());  
  32.              WSACleanup();  
  33.              return;              
  34.          }  
  35.   
  36.          //第二次调用  
  37.          int iProtocolCounts = WSAEnumProtocols(NULL, info, &dwLen);      
  38.          if (SOCKET_ERROR == iProtocolCounts)  
  39.          {  
  40.              printf("WSCEnumProtocols Error: %d", GetLastError());  
  41.              GlobalFree(info);  
  42.              WSACleanup();  
  43.              return;      
  44.          }  
  45.   
  46.          //打印本机安装的协议信息  
  47.          for (int i=0; i<iProtocolCounts; i++)  
  48.          {  
  49.              printf("\ni=%d\nProtocolDescription:%s\n", i, info[i].szProtocol);              
  50.          }  
  51.   
  52.          GlobalFree(info);      
  53.      }  
  54.      WSACleanup();  
  55. }  
0 0
原创粉丝点击