簡述:獲取現有傳送協定的相關信息。,使用技巧,
簡述:獲取現有傳送協定的相關信息。
#include <winsock2.h>
int WSAAPI WSAEnumProtocols ( LPINT lpdwProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer,
LPDWORD lpdwBufferLength);
lpProtocolBuffer:一個用PROTOCOL_INFO結構填充的緩衝區。參見下文中對PROTOCOL_INFO結構的具體描述。
lpdwBufferLength:輸入時,存有傳遞給WSAEnumProtocols()函式的lpProtocolBuffer緩衝區長度。輸出時,表示為獲取所有信息需傳遞給WSAEnumProtocols()函式的緩衝區長度。本函式不能重複調用;傳入的緩衝區必須足夠大以能存放所有的元素。這個規定降低了該函式的複雜度。由於一個機器上裝載的協定數目往往是很小的,所以並不會產生問題。
返回值:
若無錯誤發生,WSAEnumProtocols()返回協定的數目。否則的話,將返回INVALID_SOCKET錯誤,應用程式可通過WSAGetLastError()來獲取相應的錯誤代碼。
錯誤代碼:
WSANOTINITIALISED 在調用本API之前應成功調用WSAStartup()。
WSAENETDOWN 網路子系統失效。
WSAEINPROGRESS 一個阻塞WinSock調用正在進行。
WSAEINVAL 參數中有非法值。
WSAENOBUFS 緩衝區太小,無法保存所有PROTOCOL_INFO結構及其相關信息。傳入的緩衝區大小至少應等於lpdwBufferLength中返回的值。
使用技巧
通常需要兩次調用WSAEnumProtocols()函式以獲取特定的協定信息,第一次調用時指定lpdwProtocols為 NULL,調用肯定是失敗的,但參數lpdwBufferLength包含了所有協定信息需要的緩衝區長度。我們知道了這個準確長度就可以進行第二次調用了!