`
java-mans
  • 浏览: 11813319 次
文章分类
社区版块
存档分类
最新评论

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;

分享到:
评论

相关推荐

    winsock资料chm格式

    Winsock数据结构** 在Winsock中,数据通过结构体进行封装,如`sockaddr`用于存储网络地址,`sockaddr_in`是IPv4地址的结构体,而`sockaddr_in6`则是IPv6地址的结构体。这些结构体包含了端口号、IP地址等信息。 **...

    Windows下C语言网络编程快速入门

    `lpWSAData`则用于接收Winsock数据结构的信息,以验证Winsock是否成功初始化。 - **WSACleanup()**:当应用程序完成所有网络操作后,应调用`WSACleanup()`函数来清理和释放Winsock库占用的资源,确保系统的稳定性...

    Winsock API程序设计,VC6.0

    而对于IPv6,应使用`getaddrinfo`函数,它可以处理IPv4和IPv6地址,并返回一个更灵活的数据结构——`struct addrinfo`链表。 除了获取主机名和地址,Winsock API还提供了丰富的网络通信功能,如创建套接字(`socket...

    网络编程教程之winsock基础

    Winsock 使用地址结构来表示网络地址,主要包括三种类型:INET 协议族地址结构、IPv4 协议族地址结构和通用地址结构。 1. INET 协议族地址结构(sockaddr_in) 结构体 sockaddr_in 定义了 INET 协议族地址结构,...

    VB Winsock封包入门试验程序

    《VB Winsock封包入门试验程序》是一款针对初学者设计的简单示例程序,它旨在帮助用户理解如何使用Visual Basic(VB)中的Winsock控件进行网络通信,特别是关于封包和抓包的基础操作。Winsock是Windows Socket的缩写...

    c语言聊天室

    - **参数**:`wVersionRequired`指定所需的Winsock版本,`lpWSAData`用于返回Winsock数据结构。 - **示例**:`int err = WSAStartup(MAKEWORD(2, 2), &wsadata);` 初始化Winsock 2.2版本。 ##### 4. **Socket创建...

    基于远程控制的木马片段

    `:用于存储Winsock数据结构的信息。 - `sockaddr_in SockAddrIn;`:定义了一个用于接收客户端连接请求的套接字地址结构体。 - `SOCKET CSocket, SSocket;`:`CSocket`为监听套接字,`SSocket`为客户端连接套接字...

    winsock收发结构体

    这些数据往往通过特定的数据结构来传递,也就是这里的“收发结构体”。在Winsock中,常用的结构体有以下几种: 1. `sockaddr` 结构体:这个结构体用于存储地址信息,比如IP地址和端口号。它的派生类型如`sockaddr_...

    WinSock模块应用.rar

    5. **数据发送与接收**:`send`和`recv`函数是WinSock中进行数据传输的主要接口。`send`用于将数据发送到已连接的套接字,`recv`用于接收来自连接的套接字的数据。 6. **错误处理**:在WinSock编程中,要时刻关注...

    史上最全经典数据结构算法c语言实现代码合集

    数据结构3.txt 数组完全单元.txt 数组操作.txt 数组递归退出.txt 数组递归退出2.txt 文件加密.txt 文件复制.txt 文件连接.txt 无向图.txt 时间陷阱.txt 杨辉三角形.txt 栈单元加.txt 栈操作.txt 桃子...

    用VC++实现http代理

    `**:这是Winsock数据结构,用于初始化Winsock环境。 6. **`CString strHost = "111.111.111.111";`**:一个字符串变量,用于存储目标主机的IP地址。 7. **`CString DownLoadAddress = ...

    Winsock2文件

    3. **地址结构**: 在Winsock2中,IP地址和端口号通常存储在 `sockaddr_in` 结构体中。这个结构体包含了IP地址(sin_addr,IPv4为 `in_addr`,IPv6为 `in6_addr`)、端口号(sin_port)以及地址族(sin_family,通常...

    WinSock技术原理.rar

    3. **地址结构**:在WinSock中,`struct sockaddr`是一个通用地址结构,但通常我们会使用如`struct sockaddr_in`这样的特定结构体,它们包含IP地址和端口号。例如,`sin_family`定义地址族,`sin_port`设置端口号,`...

    delphi winsock2

    没有这个文件,Delphi开发者将无法直接使用Winsock2提供的功能,例如创建套接字、绑定、监听、连接、发送和接收数据等。 WSAIoctl是Winsock2 API中的一个重要函数,全称Windows Socket I/O Control,用于设置或查询...

    在WINCC中使用WinSock控件进行TCP_IP通讯的例程.pdf

    总结:这篇文档详细阐述了在WINCC环境下,利用WinSock控件实现TCP/IP通信的过程,包括控件的使用、服务器端编程、结构变量的应用以及数据传输与处理。对于希望在WINCC中实现远程通讯的工程师来说,这是一份非常实用...

    winsock(VC源码)

    3. **地址结构** Winsock使用`sockaddr`结构体表示网络地址,如`sockaddr_in`结构体用于IPv4。其中包含IP地址(sin_addr)、端口号(sin_port)和其他信息。 4. **连接与监听** 对于服务器端,使用`bind`函数将套...

    VB6.0使用winsock控件实现聊天程序(源代码)

    Winsock控件是VB6.0中用于网络通信的核心组件,它提供了TCP/IP协议的支持,能够帮助开发者实现客户端与服务器之间的数据传输。Winsock控件包含两个主要部分:控件本身(WSH)和控件的属性、方法和事件,这些都可以...

    Winsock2网络编程实用教程

    其中,`send`和`recv`函数是最常用的同步数据传输函数,而异步I/O则依赖于重叠结构和完成端口等技术实现。 5. **错误处理**:由于网络通信的不确定性,错误处理在Winsock2程序设计中尤为重要。开发者需要熟练掌握...

    WinSock网络编程.pdf

    6、主机地址标识的数据结构 7、Socket号与主机地址捆绑 8、WinSock操作模式 9、无连接协议的同步模式编程 10、无连接协议的异步模式编程 11、面向连接协议的同步模式编程 12、面向连接协议的异步模式编程

    易语言取WinSock程序源码

    接收数据`命令从连接的远程主机接收数据,通常需要配合循环结构以接收完整的数据包。 7. **关闭套接字**:当不再需要使用套接字时,使用`网络.关闭套接字`命令释放资源。 8. **清理Winsock**:程序结束前,调用`...

Global site tag (gtag.js) - Google Analytics