Windows 網絡編程

  1 網絡編程 API
  2  
  3  
  4 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );            lpWSAData 是一個返回值;成功返回 0,失敗返回 -1,錯誤代碼 WSASYSNOTREADY 表示基礎網絡子系統沒有準備好網絡通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPROGRESS 表示一個阻塞的 Sockets 操做在進程中,WSAEPROCLIM 表示 Sockets 支持的任務數到達上限,WSAEFAULT 表示 lpWSAData 不是一個有效指針
  5 WORD MAKEWORD( X, Y );                得到 wVersionRequested 正確值,WinSock 庫版本,高位指定副版本,低位制定主版本
  6 WSAEnumProtocols();                查詢協議信息
  7 int WSACleanup(void);                終止對 Windsock 庫的使用;成功返回 0,失敗返回錯誤信息
  8  
  9 int WSAGetLastError(void);            獲得最近的一次錯誤信息,不能返回 WSAStartup 的錯誤信息;聲明的錯誤信息在 winsock1.h 和 winsock2.h 中,常見 SOCKET_ERROR,值爲 -1
 10  
 11  
 12 SOCKET socket( int af, int type, int protocol );                af 制定網絡地址類型,常爲 AF_INET;type 指定套接字類型,SOCK_STREAM 表示流套接字,SOCK_DGRAM 表示數據報套接字;protocol 指定使用的協議,默認爲 TCP/IP 協議(爲 0);成功返回套接字,失敗返回 INVALID_SOCKET  
 13 int bing( SOCKET s, const struct sockaddr FAR *name, int namelen );        失敗返回 SOCKET_ERROR 錯誤,使用 TCP/IP 時返回 WSAEADDRINUSE 錯誤表示端口已經被用或處於 TIME_WAIT 狀態,若是綁定一個已經綁定的套接字將返回 WASEFAULT
 14 int listen( SOCKET s, int backlog );        若是沒有可用描述字時 listen 仍正常工做,直到請求隊列變爲空;backlog 指定等待鏈接的最大隊列長度,使用非法值時系統會自動分配一個最接近的合法值;隊列滿時產生 WSAECONNREFUSED 錯誤;成功返回 0,錯誤返回 -1,常見錯誤信息是 WSAEINVAL 表示在監聽以前未調用 bind
 15 SOCKET accept( SOCKET s, struct sockaddr *addr, int *addrlen );            s 是出於監聽狀態的描述字;addr 是一個有效的地址,在 accpt 返回後包含客戶機的 IP 地址信息;addrlen 是 addr 的長度;成功返回新的套接字
 16 int connect( SOCKET s, const struct sockaddr *name, int namelen );        失敗返回 WSAEADDRNOTAVAIL,表示 name 結構中的地址域全爲 0, WSAECONREFUSED 表示要鏈接的計算機沒有監聽指定端口的這一進程,WSAETIMEOUT 表示鏈接超時
 17  
 18 int send( SOCKET s, const char *buf, int len, int flag );            flags 爲 0 表示無特殊行爲,MSG_DONTROUTE 表示要求傳輸層不要把它發出的數據報路由出去,MSG_OOB 表示數據應該被帶外發送;成功返回發送的字節數,錯誤返回 -1,錯誤信息爲 WSAECONNABORTED 表示虛擬迴路因爲超時或協議有錯而中斷時,WSAECONNRESET 表示遠程主機套接字被強行或意外關閉,WSAETIMEOUT 表示因爲網絡故障或遠程主機系統異常而引發鏈接中斷;成功調用 send 並不意味着數據傳輸成功,如傳送系統的緩衝區空間不夠,除非套接字出於非阻塞 I/O 方式,不然 send 函數被阻塞
 19 int recv( SOCKET s, char *buf, int len, int flags );                flags 爲 0 表示無特殊行爲,爲 MSG_PEEK 表示將有用數據複製到所需緩衝區後不從系統緩衝區刪除它們
 20 int shutdown( SOCKET s, int how );        中斷鏈接,防止丟失數據,發送端通知接收端再也不發送數據或接收端通知發送端再也不接受數據;不管如何 shutdown 函數都不會阻塞;how 爲 SD_RECEIVE 表示再也不接收數據,SD_SEND 表示再也不發送數據,SD_BOTH 再也不接收和發送
 21 int closesocket( SOCKET s );            關閉套接字;調用關閉了的套接字會出現 WSAENOTSOCK 錯誤
 22  
 23 int recvfrom( SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen );            當函數返回時 from 中填入發送數據端的地址
 24 int sendto( SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen );        to 帶有接收數據的套接字目標地址信息
 25  
 26  
 27 unsigned long inet_addr( const char *cp );    將點分十進制轉換爲 32 位無符號長整型,同時取 IP 地址爲 INADDR_ANY 以容許服務器應用監聽主機上每一個網絡接口上的客戶端活動
 28 char *inet_ntoa( struct in_addr in );        將 in_addr 結構轉換到點分十進制 IP
 29 u_short htons( u_short hostshort );
 30 u_long ntohs( u_long netlong );
 31  
 32 int gethostname( char *name, int namelen );            將主機名存放到 name 中,以 '\0'結尾;成功返回 0,失敗返回 -1
 33 struct hostent *gethostbyname( const char *name );        name 是指向主機名的指針,可由 gethostname 獲得
 34 struct hostent *gethostbyaddr( const char *addr );
 35  
 36  
 37 int ioctlsocket( s, FIPBIO, &cmd );        將套接字設置爲非阻塞模式; cmd 是一個 uint64_t,得到返回信息;失敗返回 -1;設置爲非阻塞模式後 WinSock API 會馬上返回,這些調用在大多數狀況下會失敗,返回 WSAEWOULDBLOCK 信息表示請求的操做在調用期間沒有時間完成
 38 int getsocketopt( SOCKET s, int level, int optname, char *optval, int *optlen );
 39  
 40  
 41 IO 複用
 42  
 43 int select( int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout );    nfds 用來對齊,能夠忽略;WinSock 提供了 FD_SETSIZE 變量肯定集合中最多的套接字描述字數目,可用 #define 自定義;成功返回 0,失敗返回 -1
 44 FD_CLR( s, *set );                從集合中刪除描述字
 45 FD_ISSET( s, *set );                若 s 爲集合中一員,則返回 非 0,不然返回 0
 46 FD_SET( s, *set );                向集合中添加 s
 47 FD_ZERO( *set );                將 set 初始化爲空集 NULL
 48  
 49 int WSAAsycSelect( SOCKET s, HWND hwnd, unsigned int wMsg, long lEvent );        將網絡事件產生的消息發送給應用程序窗口句柄
 50  
 51  
 52 註冊表操做
 53  
 54 LONG RegopenKeyEX( HKEY hkey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult );        打開一個指定的註冊表鍵;hkey 做爲輸入參數,可取值 HKEY_CLASS_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_PERFORMANCE_DATA( NT ), HKEY_DYN_DATA( 9x );lpSubKey 做爲輸入參數指向一個非中斷字符串包含將要打開鍵的名稱,字符串以 '\0' 結尾,若是設置爲 NULL 或指向空串,程序將打開一個新的句柄,此時程序不會關閉先前打開的句柄; ulOptions 爲保留參數,必須設置爲空; samDesired 做爲輸入參數,指定訪問權限,KEY_CREATE_LINK 容許建立一個符號連接,KEY_CREATE_SUB_KEY 容許建立子鍵,KEY_ENUMRATE_SUB_KEYS 容許列舉子鍵,KEY_EXECUTE 容許讀,KEY_NOTIFY 容許更改通知,KEY_QUERY_VALUE 容許查詢子鍵數據,KEY_SET_VALUE 容許設置主鍵數據;phkResult 做爲輸出參數,指向一個被打開鍵的句柄指針;成功返回 ERROR_SUCCESS,失敗返回非 0 55 LONG RegCloseKey( HKEY hkey );            釋放制定註冊鍵的句柄;成功返回 ERROR_SUCCESS,失敗返回非 0 56 LONG RegCreateKeyEx( HKEY hkey, LPCTSTR lpSubKey, DWORD Reserved, LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition );        打開一個註冊表鍵值,鍵存在時打開它,不存在則建立;Reserved 必須設置爲 0;lpClass 是一個字符串指針,指定鍵的類型,常爲 NULL;dwOptions 指定鍵的特殊選項;lpSecurityAttributes 是一個指針,指定訪問的安全特性;lpdwDisposition 指明參數是被建立仍是被打開,REG_CREATE_NEW_KEY 表示建立,REG_OPEND_EXISTING_KEY 表示打開;成功返回 ERROR_SUCCESS, 失敗返回非 0
 57 LONG RegDeleteKey( HKEY hKey, LPCTSTR lpSubKey );        刪除一個註冊表鍵值,刪除的鍵值必需要有訪問權限;lpSubKey 是刪除的子鍵,但它不能有子鍵,他不能爲空,鍵值不區分大小寫;成功返回 0,失敗返回非 0
 58 LONG RegQueryValueEx( HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData );        獲取指定鍵的數據和類型;lpValueName 是指要獲取數據名字;lpType 用於裝載取回數據的類型;lpData 是用於裝載指定值的緩衝區;lpcbData 是用於裝載 lpData 緩衝區長度,返回成功時設爲實際裝載的長度
 59 RegEnumKeyEx
 60  
 61  
 62 網絡基本應用
 63  
 64 UCHAR NetBIOS( PNCB pNCB );
 65  
 66 int WSAEnumProtocols( LPINT lpiProtocols, LPWSAPROTOCOL_INFO lpProtocolBuffer, ILPDWORD lpdwBufferLength );        得到系統中安裝的網絡協議信息;lpiProtocols 是一個以'\0' 結尾的協議標識號數組,爲 NULL 則返回全部可用協議信息;lpProtocolBuffer 是一個用 WSAPROTOCOL_INFO 結構體填充的緩衝區,這個結構體用來存放或獲得一個指定協議的完整信息;lpdwBufferLength 做爲輸入時指定 lpProtocolBuffer 緩衝區長度,做爲輸出時獲取全部請求信息須要緩衝區的最小長度(前兩個參數都設置爲空時返回長度);該函數不能重複調用;成功返回協議個數,失敗返回 -1
 67  
 68  
 69 IP 配置信息管理
 70  
 71 DWORD GetNetworkParams( PFIXED_INFO pFixedInfo, PULONG pOutBufLen );        獲取本地計算機網絡參數;pFixedInfo 參數用來返回本地計算機的網絡參數; pOutBufLen 做爲輸入時指定 pFixedInfo 緩衝區大小,做爲輸出時若是提供的緩衝區不夠函數返回須要緩衝區大小;成功返回 ERROR_SUCCESS
 72 DWORD GetNumberOfInterfaces( PDWORD pdwNumIf );            返回本地計算機網絡接口的數量; pdwNumIf 獲取數量;成功返回 NO_ERROR
 73 DWORD GetInterfaceInfo( PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen );    返回本地計算機上網絡接口適配器列表; pIfTable 返回適配器列表,若是 pfIftable 爲 NULL 或空,則 dwOutBufLen 返回所需緩衝區大小;成功返回 NO_ERROR;失敗返回 ERROR_INSUFFICIENT_BUFFER 表示緩衝區大小不夠,需從新分配
 74 DWORD GetIfEntry( PMIB_IFROM pIfRow );            返回一個包含特定適配器信息的 MIB_IFROW 結構
 75 DWORD SetIfEntry( PMIB_IFROM pIfRow );
 76 DWORD GetIfTable( PMIB_IFTABLE pIfTable, PULONG pdwSize, BOOL bOrder );        獲取整個 MIB_IF 接口表的信息;pdwSize 做爲輸入時指定 pIfTable 緩衝區大小;做爲輸入時若提供的緩衝區不足,則返回所需緩衝區大小;bOrder 指定返回的接口表中的入口是否按照接口索引升序排列
 77 DWORD GetIpAddrTable( PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, BOOL bOrder );        取得一張包含了 IP 地址到接口的映射表; pdwSize 輸入時指定 pIpAddrTable 緩衝區大小,輸出時表示緩衝區不足,返回所需緩衝區大小;
 78 DWORD AddIPAddress( IPADDR Address, IPMask IpMask, DWORD IfIndex, PULONG NTEContext, PULONG NTEInstance );    向特定接口添加臨時 IP 地址;IfIndex 是適配器索引;NTEContext 網絡表入口;NTEInstance 網絡表實例
 79 DWORD DeleteIPAddress( ULONG NTEContext );        刪除 IP 地址
 80 BOOL DhcpNotifyConfigChange( LPWSTR lpwszServerName, LPWSTR lpwszAdapterName, BOOL bNewIpAddress, DWORD dwIpIndex, DWORD dwIpAddress, DWORD dwSubNetMask, int nDhcpAction );            通知系統 dhcp 配置變化,當即生效,需加載庫文件 dhcpcsvc.dll;參數含義依次爲主機名 NULL,網絡適配器名,IP 是否更改,指明是第幾個 IP 地址, IP 地址,子網掩碼,對 DHCP 的操做( 0 不修改, 1 啓動 DHCP , 2 禁用 DHCP
 81  
 82  
 83 輔助函數
 84  
 85 void memmove( struct in_addr inAddr, LPSTR lpAddr, 4 );        得到 IP 地址,是網絡字節序,lpAddr 等於 hostent.h_addr_list[0];調用 .isEmpty() 方法能夠判斷是否獲得 IP 地址
 86 void memset( &ncb, 0, sizeof(ncb) );                置 0  
 87 HGLOBAL GlobalAlloc( UINT uFlags, DWORDdwBytes );        全局堆分配,提供這個函數只是爲了與 16 位的 Windows 相兼容;分配屬性(方式),GMEM_ZEROINIT 申請內存初始化爲 0, GMEM_MOVEABLE 分配可移動內存,返回指針, GMEM_FIXED分配固定內存,返回指針, GPTR 固定和初始化, GHND 移動和初始化,分配的字節數;成功返回句柄,失敗返回 NULL
 88 GlobalFree
 89  
 90 char *LoadLibrary( char * );                    加載庫文件;成功返回指向庫文件名的指針 library_point,失敗返回 NULL
 91 char *FreeLibrary( char * );
 92 char *GetProcAddress( library_point, function_name );        成功返回函數的別名,可經過別名調用函數
 93  
 94 strlen_s
 95 char *strrev( char *s );                    字符串反轉,不包括 NULL, Linux系統中沒有 __strrev 函數
 96 itoa
 97 int atoi( const char *nptr );                    字符串轉化爲整數
 98  
 99  
100  
101 頭文件
102  
103  
104 conio.h
105 IPHlpApi.h            IP 助手
106 nb30.h
107 Winbase.h            包含在 windows.h 中
108 WinDef.h            類型定義
109 Windows.h  
110 WinNT.h                WCHAR, CHAR, CCHAR
111 WinSock1.h
112 WinSock2.h            WSAPROTOCOL_INFO
113 wtypes.h
114  
115  
116  
117 庫文件            #pragma comment( lib, "netapi32.lib");
118  
119 iphlpapi.lib            IP 助手
120 Kernel32.lib.            GlobalAlloc
121 netapi32.lib            NCB
122 ws2_32.lib            WinSock2
123  
124  
125  
126 自定義類型
127  
128  
129 BOOL                typedef int BOOL;
130 BOOLEAN                typedef BYTE BOOLEAN;
131 BYTE                typedef unsigned char BYTE;
132 CCHAR                typedef char CCHAR;
133 CHAR                typedef char CHAR;系統移植
134 CONST                #define CONST const
135 DWORD                typedef unsigned long DWORD; 32-bit unsigned integer
136 INT                typedef int INT; 32bits
137 INT8                typedef signed char INT8;
138 INT16                typedef signed short INT16;
139 INT32                typedef signed int INT32;
140 INT64                typedef signed __int64 INT64;
141 LONG                typedef long LONG; 32-bit signed integer
142 LONGLONG            #if !defined(_M_IX86) typedef __int64 LONGLONG; #else typedef double LONGLONG; #endif(C++)
143 PVOID                typedef void *PVOID;
144 TCHAR                #ifdef UNICODE typedef WCHAR TCHAR; #else typedef char TCHAR; #endif
145 UCAHR                typedef unsigned char UCHAR;
146 WCHAR                typedef wchar_t WCHAR; 16-bit Unicode character
147 WORD                typedef unsigned short WORD;
148  
149 fd_set
150 HANDLE                typedef PVOID HANDLE;
151 HGLOBAL                typedef HANDLE HGLOBAL;
152 HKEY                typedef HANDLE HKEY;
153 LANA_ENUM            該結構中包含系統中邏輯網卡數目及每一個網卡號;LANA 編號對應於網卡及傳輸協議的惟一組合
154 LPCTSTR
155 PHKEY
156 PIP_ADAPTER_INFO
157 REGSAM
158  
159 https://msdn.microsoft.com/en-us/library/aa383751
160  
161  
162  
163 結構體
164  
165  
166 typedef struct WSAData{
167     WORD wVersion;                        //但願使用的 Winsock 版本,
168     WORD wHighVersion;                    //返回現有 WinSock 庫的最高版本
169     char szDescription[WSADESCRIPTION + 1];            //長度不能超過 256,一般不使用
170     char szSystemStatus[WSASYS_STATUS_LEN + 1];        //長度不能超過 256,一般不使用
171     unsigned short iMaxSockets;                //可同時打開的套接字數,不固定,通常不使用
172     unsigned short iMaxUdpDg;                //數據報最大長度,通常不使用,用 WSAEnumProtocols 查詢
173     char FAR *lpVendorInfo;                    //不使用
174     char FAR *LPWSADATA;
175 }WASDATA, *LPWSADATA;
176  
177 struct sockaddr{
178     u_short sa_family;
179     char sa_data[14];
180 };
181  
182 struct sockaddr_in{
183     short sin_family;                    //必須設爲 AF_INET
184     u_short sin_port;                    //要把端口號由主機字節序轉換爲網絡字節序,設置爲 0 則由應用程序分配一個 1024~5000 之間的一個端口
185     struct in_addr sin_addr;                //存放 4 位字節無符號長整型的 IP 地址
186     char sin_zero[8];                    //填充項
187 }
188  
189 typedef struct in_addr {                                                         
190         union {
191                 struct {
192                         u_char s_b1,s_b2,s_b3,s_b4;
193                 } S_un_b;
194                 struct {
195                         u_short s_w1,s_w2;
196                 } S_un_w;
197                 u_long S_addr;
198         } S_un;
199 } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
200  
201 typedef struct {                                                                 
202         union {
203                 struct {
204                         u_char s_b1,s_b2,s_b3,s_b4;
205                 } S_un_b;
206                 struct {
207                         u_short s_w1,s_w2;
208                 } S_un_w;
209                 u_long S_addr;
210         } S_un;
211 } IPAddr;
212  
213 struct timeval{
214     long tv_sec;
215     long tv_usec;                        //毫秒
216 }
217  
218 struct hostent{
219     char *h_name;
220     char *h_aliases;
221     short h_addrtype;                    // 通常爲 AF_INET
222     short h_length;                        // 通常爲 4
223     char *h_addr_list;                    // 存放 ip 地址列表的數組,每一個元素存放一個 IP 地址
224 }
225  
226 typedef struct _NCB{                        // 網絡控制塊
227     UCHAR ncb_command;                    NetBIOS 執行的命令
228     UCHAR ncb_retcode;                    操做的返回代碼
229     UCHAR ncb_lsn;                        對應本地會話編號
230     UCHAR ncb_num;                        指定本地會話編號
231     PUCHAR ncb_buffer;                    數據緩衝區
232     WORD ncb_length;                    緩衝區長度
233     UCHAR ncb_callname[NCBNAMSZ];                指定遠程應用的名字
234     UCHAR ncb_name[NCBNAMSZ];                指定應用程序已知的名字
235     UCHAR ncb_rto;                        接受操做的時限
236     UCHAR ncb_sto;                        發送操做的時限
237     void( CALLBACK *ncb_post )( struct _NCB *);        制定異步命令完成後須要調用的後例程的地址    
238     UCHAR ncb_lana_num;                    指定上面執行命令的 LANA 編號
239     UCHAR ncb_cmd_cplt;                    指定操做的返回代碼
240 #ifdef _WIN64
241     UCHAR ncb_reserve[18];                    保留字段
242 #else
243     UCHAR ncb_reserve[10];                    
244 #endif
245     HANDLE ncb_event;                    設置爲「未傳信」狀態
246 }NCB, *PNCB;
247  
248  
249 typedef struct _WSAPROTOCOL_INFO {
250     DWORD dwServiceFlags1;                    表示不一樣協議屬性的一個位字段;XP1_CONNECTIONLESS(0x00000001),XP1_GUARANTEED_DELIVERY,XP1_GUARANTEED_ORDER,XP1_MESSAGE_ORIENTED,XP1_PSEUDO_STREAM,XP1_GRACEFUL_CLOSE,XP1_EXPEDITED_DATA,XP1_CONNECT_DATA,XP1_DISCONNECT_DATA,XP1_SUPPORT_BROADCAST,XP1_SUPPORT_MULTIPOINT,XP1_MULTIPOINT_CONTROL_PLANE,XP1_MULTIPOINT_DATA_PLANE,XP1_QOS_SUPPORTED,XP1_INTERRUPT,XP1_UNI_SEND,XP1_UNI_RECV,XP1_IFS_HANDLES,XP1_PARTIAL_MESSAGE,XP1_SAN_SUPPORT_SDP
251     DWORD dwServiceFlags2;                    Reserved for additional protocol-attribute definitions.
252     DWORD dwServiceFlags3;                    Reserved for additional protocol-attribute definitions.
253     DWORD dwServiceFlags4;                    Reserved for additional protocol-attribute definitions.
254     DWORD dwProviderFlags;                    
255     GUID  ProviderId;                    協議提供商
256     DWORD dwCatalogEntryId;                    A unique identifier assigned by the WS2_32.DLL for each WSAPROTOCOL_INFO structure
257     WSAPROTOCOLCHAIN ProtocolChain;                協議鏈
258     int iVersion;                        The protocol version identifier.
259     int iAddressFamily;                    地址簇;區分正確協議的定義結構;AF_INET,AF_IPX,AF_APPLETALK,AF_NETBIOS,AF_INET6,AF_IRDA,AF_BTH
260     int iMaxSockAddr;                    The maximum address length, in bytes.
261     int iMinSockAddr;                    The minimum address length, in bytes.
262     int iSocketType;                    定義套接字類型;SOCK_STREAM,SOCK_DGRAM,SOCK_RAW,SOCK_RDM,SOCK_SEQPACKET
263     int iProtocol;                        定義該條目屬於哪個協議;IPPROTO_ICMP,IPPROTO_IGMP,BTHPROTO_RFCOMM,IPPROTO_TCP,IPPROTO_UDP,IPPROTO_ICMPV6,IPPROTO_RM
264     int iProtocolMaxOffset;                    
265     int iNetworkByteOrder;                    big-endian or little-endian with the values 0 and 1
266     int iSecurityScheme;                    支持的安全特性
267     DWORD dwMessageSize;                    The maximum message size, in bytes, supported by the protocol;
268     DWORD dwProviderReserved;                Reserved for use by service providers
269     TCHAR szProtocol[WSAPROTOCOL_LEN+1];            contains a human-readable name identifying the protocol
270 } WSAPROTOCOL_INFO, *LPWSAPROTOCOL_INFO;
271 https://msdn.microsoft.com/en-us/library/windows/desktop/ms741675(v=vs.85).aspx
272  
273  
274 typedef struct{
275     char HostName[MAX_HOSTNAME_LEN + 4];
276     char DomainName[MAX_DOMAIN_NAME_LEN + 4];
277     PIP_ADDR_STRING CurrentDnsServer;
278     IP_ADDR_STRING DnsServerList;  
279     UINT NodeType;
280     char ScopeId[MAX_SCOPE_ID_LEN + 4];
281     UINT EnableRouting;
282     UINT EnableProxy;
283     UINT EnableDns;
284 }FIXED_INFO, *PFIXED_INFO;
285  
286 typedef struct _IP_ADDR_STRING{
287     struct _IP_ADDR_STRING *Next;
288     IP_ADDRESS_STRING IpAddress;                //該結構體中包含字符串成員 String,描述了點分十進制 ip 地址
289     IP_MASK_STRING IpMask;
290     DWORD Context;                        //表示網絡表入口
291 }IP_ADDR_STRING, *PIP_ADDR_STRING;
292  
293  
294 typedef struct _IP_INTERFACE_INFO{
295     LONG NumAdapters;                    //指示 Adapter 數組中適配器數量
296     IP_ADAPTER_INDEX_MAP Adapter[1];            //
297 }IP_INTERFACE_INFO, *PIP_INTERFACE_INFO;
298  
299 typedef struct _IP_ADAPTER_INDEX_MAP{
300     ULONG index;                        //與此適配器關聯的接口索引
301     WCHAR Name[MAX_ADAPTER_INDEX_MAP];            //適配器名稱
302 }IP_ADAPTER_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP;
303  
304  
305 typedef struct _MIB_IFTABLE{
306     DWORD dwNumEntries;                        //指定數組中入口的數量
307     MIB_IFROW table[ANY_SIZE];                    //指定接口表
308 }MIB_IFTABLE, *PMIB_IFTABLE;
309  
310 typedef struct _MIB_IFROW{
311     WCHAR wszName[MAX_INTERFACE_NAME_LEN];            //指定接口名稱
312     DWORD dwIndex;                        //指定標識接口的索引
313     DWORD dwType;                        //指定接口類型 MIB_IF_TYPE_ETHERNET MIB_IF_TYPE_PPP
314     DWORD dwMtu;                        //指定最大傳輸單元
315     DWORD dwSpeed;                        //接口速度
316     DWORD dwPhysAddrLen;                        // bPhysAddr 所指物理地址長度
317     BYTE bPhysAddr[MAXLEN_PHYSADDR];                        //
318     DWORD dwAdminStatus;                        //接口管理狀態,MIB_IF_ADMIN_STATUS_UP/DOWN 接口(不)可被管理
319     DWORD dwOperStatus;                        //接口運行狀態
320     DWORD dwLastChange;                        //
321     DWORD dwInOctets;                        //此接口接收到的八進制數據數量
322     DWORD dwInUcastPkts;                        //此接口收到的單播封包數量
323     DWORD dwInNucastPkts;                        //非單播封包
324     DWORD dwInDiscards;                        //已經丟棄的封包數量(不出錯的)
325     DWORD dwInErrors;                        //丟棄的出錯的封包數量
326     DWORD dwInUnknownProtos;                        //
327     DWORD dwOutOctets;                        //
328     DWORD dwOutUcastPkts;                        //
329     DWORD dwOutNUcastPkts;                        //
330     DWORD dwOutDiscards;                        //
331     DWORD dwOutErrors;                            //
332     DWORD dwOutQlen;                        //發送隊列長度
333     DWORD dwDescrLen;                        //指定 bDescr 長度
334     BYTE bDescr[MAXLEN_IFDESCR];                    //接口描述信息
335 }MIB_IFROW, *PMIB_IFROW;
336  
337  
338 typedef struct _MIB_IPADDRTABLE{
339     DWORD dwNumEntries;
340     MIB_IPADDRROW table[ANY_SIZE];
341 }MIB_IPADDRTABLE, *PMIB_IPADDRTABLE;
342  
343 typedef struct _MIB_IPADDRROW{
344     DWORD dwAddr;                            //指示 IP 地址
345     DWORD dwIndex;                            //指示與 IP 地址關聯的接口索引
346     DWORD dwMask;                            //子網掩碼
347     DWORD dwBCastAddr;                        //廣播地址
348     DWORD dwReasmSize;                        //對已收到的數據報進行從新組裝後的最大長度
349     unsigned short unused1;                        //保留位
350     unsigned short wType;                        //指定地址類型或狀態; MIB_IPADDR_PRIMARY 主 IP 地址,DYNAMIC 動態地址,DISCONNECTED 地址在未鏈接的接口上,DELETE 地址將要被刪除,TRANSIENT 瞬時地址
351 }MIB_IPADDRROW, *PMIB_IPADDRROW;
352  
353  
354  
355 註冊表
356  
357  
358  
359 基礎
360  
361 unsigned long32 位。
362  
363  
364 TCP 服務端模型:socket -> bind -> accept -> recv -> send -> close        // 調用 shutdown
365 TCP 客戶端模型:socket -> connect -> send -> recv -> close
366  
367  
368 UDP 服務端模型:socket -> bind -> recvfrom -> sendto -> close
369 UDP 客戶端模型:socket -> sendto -> recvfrom -> close
370  
371  
372 利用 netbios 獲取網卡號不必定準確,由於他會獲得不少虛擬網卡地址。
373  
374  
375  
376 實例
377  
378 WSADATA wsaData;    WSAStartup( MAKEWORD(2,2), &wsaData );
相關文章
相關標籤/搜索