zoukankan      html  css  js  c++  java
  • 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,失败返回 -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 作为输入参数指向一个非中断字符串包含将要打开键的名称,字符串以 '' 结尾,如果设置为 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 是一个以'' 结尾的协议标识号数组,为 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 );
  • 相关阅读:
    codeforces水题100道 第十一题 Codeforces Round #143 (Div. 2) A. Team (brute force)
    codeforces水题100道 第十题 Codeforces Round #277 (Div. 2) A. Calculating Function (math)
    codeforces水题100道 第九题 Codeforces Beta Round #63 (Div. 2) Young Physicist (math)
    codeforces水题100道 第八题 Codeforces Round #274 (Div. 2) A. Expression (math)
    vs2015
    强制IE浏览器或WebBrowser控件使用指定版本显示网页
    一个基于jquery的智能提示控件intellSeach.js
    WebBrowser中html元素如何触发winform事件
    ASP.NET用DataSet导出到Excel
    ASP.NET Excel数据导入数据库
  • 原文地址:https://www.cnblogs.com/little-snake/p/5398251.html
Copyright © 2011-2022 走看看