一种数据结构,这个结构被用来存储被WSAStartup函数调用后返回的[Windows Sockets](https://baike.baidu.com/item/Windows Sockets)数据。它包含Winsock.dll执行的数据。
//摘自<winsock.h> typedef struct WSAData { WORD wVersion; WORD wHighVersion; #ifdef _WIN64 unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; #else char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; #endif } WSADATA; WSADATA结构被用来保存AfxSocketInit函数返回的WindowsSockets初始化信息。
用户使用socket系统调用编写应用程序时,通过一个数字来表示一个socket,所有的操作都在该数字上进行,这个数字称为套接字描述符。在系统调用的实现函数里,这个数字就会被映射成一个表示socket的结构体,该结构体保存了该socket的所有属性和数据。在内核的协议中实现中,关于表示 socket的结构体.
struct socket
这是一个基本的BSD socket,我们调用socket系统调用创建的各种不同类型的socket,开始创建的都是它,到后面,各种不同类型的socket在它的基础上进行 各种扩展。struct socket是在虚拟文件系统上被创建出来的,可以把它看成一个文件,是可以被安全地扩展的。
//下面是其完整定义: struct socket{ socket_state state;//the state of socket unsigned long flags; const struct proto_ops *ops; struct fasync_struct *fasync_list; struct file *file; struct sock *sk; wait_queue_head_t wait; short type; };
struct sockaddr{ sa_family_t sa_familay; //地址族,最常用的是"AF_INET"(IPV4)和"AF_INET6"(IPV6); char sa_data[14]; //包含套接字中的目标地址和端口信息; };
sockaddr的缺陷:sa_data把目标地址和端口号混在一起了,于是,有了如下的改进
//在netinet/in.h中定义 struct sockaddr_in{ sa_family_t sin_family;//地址族,常用AF_INET uint16_t sin_port;//16位TCP/UDP端口号 struct in_addr sin_addr;//32位IP地址 char sin_zero[8];//无用,为了保持和sockadd的大小一样 }; struct in_addr{ in_addr_t s_addr;//32位IPV4地址 }