WinSock数据结构

WinSock数据结构:

VC的头文件winsock.hwinsock2.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_settimeval结构:

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; //01分别代表big-Endianlittle-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;

你可能感兴趣的:(数据结构)