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;

 

posted on 2010-05-21 19:35  android开发实例  阅读(1246)  评论(0编辑  收藏  举报

导航