WinSock数据结构:
在VC的头文件winsock.h和winsock2.h中定义了许多常数、变量类型和数据结构:
1、动态链接库关联的数据结构WSAData:(winsock2.h中的定义,winsock.h中的定义类似)
#define WSADESCRIPTION_LEN 256
#define WSASYS_STATUS_LEN 128
typedef struct WSAData {
WORD wVersion; //winsock版本
WORD wHighVersion; //系统可以支持的最高版本
char szDescription[WSADESCRIPTION_LEN+1];
//可能需要的winsock信息(最多256个的非终止字符串)
char szSystemStatus[WSASYS_STATUS_LEN+1]; //状态和配置信息
unsigned short iMaxSockets; //预留后向兼容的,版本2不用的
unsigned short iMaxUdpDg; //同上,预留用于后向兼容
char FAR * lpVendorInfo; //同上
} WSADATA, FAR * LPWSADATA;
2、用于说明网络寻址信息的sockaddr地址结构:
/*
* Structure used by kernel to store most
* addresses.
*/
struct sockaddr {
u_short sa_family; /* address family , AF_INET表示套接字处于Internet域*/
char sa_data[14]; /* up to 14 bytes of direct address */
};
/*
* Socket address, internet style.
*/
struct sockaddr_in {
short sin_family;
u_short sin_port; //两个字节服务端口地址,缺省为0时自动分配
//1024~5000之间的数值,网络字节顺序
struct in_addr sin_addr; //四字节IP地址,无符号类型
char sin_zero[8]; //与sockaddr结构sa_data字段的长度保留一致
//只充当填充项的作用
};
/*
* Internet address (old style... should be updated)
*/
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
/* can be used for most tcp & ip code */
#define s_host S_un.S_un_b.s_b2
/* host on imp */
#define s_net S_un.S_un_b.s_b1
/* network */
#define s_imp S_un.S_un_w.s_w2
/* imp */
#define s_impno S_un.S_un_b.s_b4
/* imp # */
#define s_lh S_un.S_un_b.s_b3
/* logical host */
};
/*
* SockAddr Information
*/
typedef struct _SOCKET_ADDRESS {
LPSOCKADDR lpSockaddr ; //指向套接字地址
INT iSockaddrLength ; //套接字地址长度(字节)
} SOCKET_ADDRESS, *PSOCKET_ADDRESS, FAR * LPSOCKET_ADDRESS ;
3、用于存放或返回主机信息的hosten结构:
/*
* Structures returned by network data base library, taken from the
* BSD file netdb.h. All addresses are supplied in host order, and
* returned in network order (suitable for use in system calls).
*/
struct hostent {
char FAR * h_name; /* official name of host,域名系统可返回应答 */
char FAR * FAR * h_aliases; /* alias list 多名数组*/
short h_addrtype; /* host address type 返回的地址类型*/
short h_length; /* length of address 返回的地址长度(字节)*/
char FAR * FAR * h_addr_list;
/* list of addresses 用于主机网络字节顺序的地址表*/
#define h_addr h_addr_list[0] /* address, for backward compat */
};
4、用于存放或返回给定服务名字的服务名和服务号的servent结构:
struct servent {
char FAR * s_name; /* official service name 服务的官方名字*/
char FAR * FAR * s_aliases; /* alias list 非空字符的别名数组*/
short s_port; /* port # 网络顺序的服务对应的端口号*/
char FAR * s_proto; /* protocol to use 服务应用的协议名*/
};
5、用于存放或返回给定协议信息的protoent结构:
struct protoent {
char FAR * p_name; /* official protocol name 协议的官方名字*/
char FAR * FAR * p_aliases; /* alias list 非空字符的别名数组*/
short p_proto; /* protocol # 主机顺序的协议号*/
};
6、用于select()函数的套接字分类fd_set和timeval结构:
typedef struct fd_set {
u_int fd_count; /* how many are SET?集合中套接字个数 */
SOCKET fd_array[FD_SETSIZE];
/* an array of SOCKETs 在集合中的套接字数组,其中FD_SETSIZE=64*/
} fd_set;
/*
* Structure used in select() call, taken from the BSD file sys/time.h.
*/
struct timeval {
long tv_sec; /* seconds 等待时间秒*/
long tv_usec; /* and microseconds 等待时间微秒*/
};
7、用于组播绑定的ip_mreq结构:
/*
* Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
*/
struct ip_mreq {
struct in_addr imr_multiaddr;
/* IP multicast address of group 加入的组播IP地址*/
struct in_addr imr_interface;
/* local IP address of interface 加入组播的本地单播IP地址*/
};
8、包含命名空间提供者注册信息的WSANAMESPACE_INFO结构:
ANSI版本:
typedef struct _WSANAMESPACE_INFOA {
GUID NSProviderId; //命名空间提供者的唯一标识符
DWORD dwNameSpace; //提供者实现支持的命名空间
BOOL fActive; //表示提供者是否处于活动状态
DWORD dwVersion; //命名空间的版本标识符
LPSTR lpszIdentifier; //提供者的显示字符串
} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA;
UNICODE版本:
typedef struct _WSANAMESPACE_INFOW {
GUID NSProviderId;
DWORD dwNameSpace;
BOOL fActive;
DWORD dwVersion;
LPWSTR lpszIdentifier;
} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW;
9、包含协议链目录项识别符的计数表WSAPROTOCOLCHAIN:
#define MAX_PROTOCOL_CHAIN 7
typedef struct _WSAPROTOCOLCHAIN {
int ChainLen; /* the length of the chain, */
/* length = 0 means layered protocol, 分层协议*/
/* length = 1 means base protocol, 基本协议*/
/* length > 1 means protocol chain 其他协议链*/
DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
/* a list of dwCatalogEntryIds 协议链项的数组*/
} WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN;
10、定义套接字特性的WSAPROTOCOL_INFO结构:
#define WSAPROTOCOL_LEN 255
ANSI版本:
typedef struct _WSAPROTOCOL_INFOA {
DWORD dwServiceFlags1; //协议提供服务组合
DWORD dwServiceFlags2; //预留给附加的协议属性定义
DWORD dwServiceFlags3; //预留给附加的协议属性定义
DWORD dwServiceFlags4; //预留给附加的协议属性定义
DWORD dwProviderFlags; //提供这个协议怎样表示协议目录的信息
GUID ProviderId; //全球唯一指定的服务提供方标识符
DWORD dwCatalogEntryId; //为每个这样的结构分配的唯一标识符
WSAPROTOCOLCHAIN ProtocolChain; //对应协议的WSAPROTOCOLCHAIN结构
int iVersion; //协议版本标识符
int iAddressFamily; //协议地址族
int iMaxSockAddr; //最大地址长度,字节为单位
int iMinSockAddr; //最小地址长度,字节为单位
int iSocketType; //套接字类型值
int iProtocol; //协议值
int iProtocolMaxOffset; //指定协议值最大偏移量
int iNetworkByteOrder; //用0和1分别代表big-Endian和little-Endian
int iSecurityScheme; //暗示采用安全机制的类型
DWORD dwMessageSize; //协议支持的最大消息大小,字节为单位
DWORD dwProviderReserved; //预留给服务提供方使用
CHAR szProtocol[WSAPROTOCOL_LEN+1]; //人可识别的协议名
} WSAPROTOCOL_INFOA, FAR * LPWSAPROTOCOL_INFOA;
UNICODE版本:
typedef struct _WSAPROTOCOL_INFOW {
DWORD dwServiceFlags1;
DWORD dwServiceFlags2;
DWORD dwServiceFlags3;
DWORD dwServiceFlags4;
DWORD dwProviderFlags;
GUID ProviderId;
DWORD dwCatalogEntryId;
WSAPROTOCOLCHAIN ProtocolChain;
int iVersion;
int iAddressFamily;
int iMaxSockAddr;
int iMinSockAddr;
int iSocketType;
int iProtocol;
int iProtocolMaxOffset;
int iNetworkByteOrder;
int iSecurityScheme;
DWORD dwMessageSize;
DWORD dwProviderReserved;
WCHAR szProtocol[WSAPROTOCOL_LEN+1];
} WSAPROTOCOL_INFOW, FAR * LPWSAPROTOCOL_INFOW;
11、允许对数据缓冲区创建和操作的WSABUF结构:
typedef struct _WSABUF {
u_long len; /* the length of the buffer,字节为单位 */
char FAR * buf; /* the pointer to the buffer */
} WSABUF, FAR * LPWSABUF;
12、作为启动与完成重叠I/O之间通信媒介的WSAOVERLAPPED结构:
typedef struct _WSAOVERLAPPED {
DWORD Internal; //预留给内部实现重叠I/O的实体
DWORD InternalHigh; //预留给内部实现重叠I/O的实体
DWORD Offset; //预留给服务提供方
DWORD OffsetHigh; //预留给服务提供方
WSAEVENT hEvent; //如果存在例程,用于WSAEVENT结构事件,否则为null
} WSAOVERLAPPED, FAR * LPWSAOVERLAPPED;
13、包含特定服务类的WSAServiceClassInfo结构:
ANSI版本
typedef struct _WSAServiceClassInfoA
{
LPGUID lpServiceClassId; //服务类的唯一标识符
LPSTR lpszServiceClassName; //服务类对应的熟知名
DWORD dwCount; //服务信息的项数
LPWSANSCLASSINFOA lpClassInfos; //WSANSCLASSINFO结构指针
}WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA;
UNICODE版本:
typedef struct _WSAServiceClassInfoW
{
LPGUID lpServiceClassId;
LPWSTR lpszServiceClassName;
DWORD dwCount;
LPWSANSCLASSINFOW lpClassInfos;
}WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW;
14、给定服务信息的WSAQUERYSET结构:
ANSI版本:
typedef struct _WSAQuerySetA
{
DWORD dwSize; //必须设为WSAQUERYSET结构大小
LPSTR lpszServiceInstanceName; // 引用包含服务名的字符串
LPGUID lpServiceClassId; //对应服务类的GUID
LPWSAVERSION lpVersion; //引用的版本号(可选)
LPSTR lpszComment; //查询忽略的注释
DWORD dwNameSpace; //约束或没有约束NS_ALL名字空间的标识符
LPGUID lpNSProviderId; //引用具体命名空间提供方GUID(可选)
LPSTR lpszContext; //引用分级命名空间查询的起点(可选)
DWORD dwNumberOfProtocols; //下面数组的大小(字节为单位)
LPAFPROTOCOLS lpafpProtocols; //引用AFPROTOCOLS结构数组(可选)
LPSTR lpszQueryString; //引用包含SQL查询文本字符串(可选)
DWORD dwNumberOfCsAddrs; //查询忽略
LPCSADDR_INFO lpcsaBuffer; //查询忽略
DWORD dwOutputFlags; //查询忽略
LPBLOB lpBlob; //指向提供方特定的实体
} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA;
UNICODE版本:
typedef struct _WSAQuerySetW
{
DWORD dwSize;
LPWSTR lpszServiceInstanceName;
LPGUID lpServiceClassId;
LPWSAVERSION lpVersion;
LPWSTR lpszComment;
DWORD dwNameSpace;
LPGUID lpNSProviderId;
LPWSTR lpszContext;
DWORD dwNumberOfProtocols;
LPAFPROTOCOLS lpafpProtocols;
LPWSTR lpszQueryString;
DWORD dwNumberOfCsAddrs;
LPCSADDR_INFO lpcsaBuffer;
DWORD dwOutputFlags;
LPBLOB lpBlob;
} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW;
15、对注册命名空间调用规定完成通知配置:
typedef struct _WSACOMPLETION {
WSACOMPLETIONTYPE Type; //请求的完成通知类型
union {
struct {
HWND hWnd; //消息窗口句柄
UINT uMsg; //指定接收消息的名字
WPARAM context; //句柄或消息背景参数(windows数据类型)
} WindowMessage;
struct {
LPWSAOVERLAPPED lpOverlapped;
//指向WSAOVERLAPPED结构的指针
} Event;
struct {
LPWSAOVERLAPPED lpOverlapped; //指向WSAOVERLAPPED结构的指针
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
//完成例程地址
} Apc;
struct {
LPWSAOVERLAPPED lpOverlapped; //指向WSAOVERLAPPED结构的指针
HANDLE hPort; //指向端口的句柄
ULONG_PTR Key; //指向一个密钥
} Port;
} Parameters;
} WSACOMPLETION;
16、存放地址和无连接和面向连接套接字选项控制信息的WSAMSG结构:
typedef struct _WSAMSG {
LPSOCKADDR name; //无连接服务存放远端地址信息
INT namelen; //远端地址信息长度
LPWSABUF lpBuffers; //指向WSABUF结构指针用于接收消息数据
//允许多缓冲区分散/收集I/O数据
DWORD dwBufferCount; //指向一个或更多的控制标志(MSG_BCAST广播、
//MSG_MCAST多播、MSG_TRUNC截取的数据报、MSG_CTRUNC截取的控制数据)
WSABUF Control; //用于指定控制选项数据的WSABUF结构
DWORD dwFlags; //一个多个控制标志
} WSAMSG, *PWSAMSG, *LPWSAMSG;
17、存储套接字网络事件内部信息的WSANETWORKEVENTS结构:
/*
* WinSock 2 extension -- data type for WSAEnumNetworkEvents()
*/
typedef struct _WSANETWORKEVENTS {
long lNetworkEvents; //指示哪个FD_XXX网络事件出现
int iErrorCode[FD_MAX_EVENTS];
//包含任何错误代码的数组,数组元素的位置由上面的事件确定
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;
18、提供服务质量的FLOWSPEC结构:
typedef struct _flowspec {
ULONG TokenRate; //指定流操作期间允许数据传送速率
ULONG TokenBucketSize; //给定流方向产生最大信用量(帧大小),字节为单位
ULONG PeakBandwidth; //给定流最大传输速率,字节数/每秒
ULONG Latency; //双方传输最大可接受的延迟,毫秒为单位
ULONG DelayVariation; //分组经历最大和最小延迟之差,毫秒为单位
SERVICETYPE ServiceType; //指定流协商的服务质量等级
ULONG MaxSduSize; //指定流允许或使用的最大分组大小,字节为单位
ULONG MinimumPolicedSize; //指定质量要求的最小分组大小,字节为单位
} FLOWSPEC, *PFLOWSPEC, *LPFLOWSPEC;