#include <stdio.h> #include <tchar.h> #include <winsock2.h> #include <windows.h> #pragma comment(lib, "Ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; LPWSAPROTOCOL_INFO lpInfo; LPBYTE lpBuf; DWORD dwLength; //加载socket库 int err = WSAStartup( MAKEWORD(2,2), &wsaData); if(err != 0) { _tprintf(_T("Could not found usable winsock.dll/nErrorCode:%d/n"), WSAGetLastError()); return -1; } //空调用,取得lpInfo要用到的内存容量 int eumErr = WSAEnumProtocols(NULL, NULL, &dwLength); if(eumErr == SOCKET_ERROR) { if(WSAGetLastError() != WSAENOBUFS) { _tprintf(_T("call WSAEnum fn faild! ErrorCode:%d/n"),WSAGetLastError()); return -1; } } if(dwLength > sizeof(LPWSAPROTOCOL_INFO)) { lpBuf = (LPBYTE)malloc(dwLength+1); if(lpBuf == NULL) { _tprintf(_T("could not mallco buf/n.ErrorCode:%d"), GetLastError()); return -1; } } int nCount = WSAEnumProtocols(NULL, (LPWSAPROTOCOL_INFO)lpBuf, &dwLength); if( nCount == SOCKET_ERROR) { _tprintf(_T("Enum Error code:%d/n"), WSAGetLastError()); free(lpBuf); return -1; } lpInfo = (LPWSAPROTOCOL_INFO)lpBuf; for(int count=0; count<nCount; count++) { _tprintf(_T("NO%d:/n%s/n"), count, lpInfo->szProtocol); lpInfo++; printf("/n"); } free(lpBuf); WSACleanup(); //卸载socket库 return 0; }