欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

98-网络编程——第四章协议软件接口(下)

程序员文章站 2022-06-05 22:05:15
...

25.Windows套接字是Windows环境下的网络编程接口

26.Windows Sockets一般由两部分组成:开发组件和运行组件

27.开发组件是供程序员开发Windows Sockets应用程序使用的,它包括介绍Windows Sockets实现的文档,Windows Sockets应用程序接口(API)引入库和一些头文件

28.头文件winsock.h、winsock2.h对应于WinSock 1和Winsock 2,是Windows Sockets最重要的头文件,他们包括了Windows Sockets实现所定义的宏、常数值、数据结构和函数调用接口原型

29.运行组件是Windows Sockets应用程序接口的动态链接库(DLL),应用程序在执行时通过装入它实现网络通信功能

30.在应用程序使用任何Windows Sockets API调用之前,必须先调用启动函数WSAStartup()来完成Windows Sockets DLL的初始化,协商版本支持,分配必要的资源。

31.在应用程序完成了对Windows Sockets DLL的使用之后,必须调用函数WSACleanup()从Windows Sockets实现中注销自己并允许实现释放为自己分配的任何资源

32.所有进程(包括应用程序或动态链接库)在调用WinSock函数之前必须对Windows Sockets DLL的使用进行初始化操作

33.初始化Windows Sockets DLL需要使用函数WSAStartup(),该函数时网络程序中最先使用的套接字函数,其他套接字函数都要在WSAStartup()被成功调用后才能正常工作

函数调用成功,返回0;否则,返回错误码

34.当应用程序完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源

35.每一次WSAStartup()调用,必须有一个与之对应的WSACleanup()调用

WSACleanup()函数没有参数,成功返回0,否则返回错误码

36.物理地址:网络中的节点(主机或路由器)都是链路层地址,通常称之为物理地址或MAC地址,该地址时网络节点中适配器的唯一标识,存在于每个数据包的帧首部

物理地址仅应用在局域网中

37.IP地址:互联网上每个主机和路由器都有IP地址,它将网络号和主机号编码在一起。在IPv4环境下,IP地址长度为32位;在IPv6环境下,IP地址长度为128位。IP地址存在于IP数据包的首部,在全网范围内唯一标识该数据包的发送端和目的端

38.端口号:网络层的IP地址用来寻址指定的计算机或者网络设备,而传输层的端口号用来确定发送给目的设备上的哪个应用程序接收该数据包。端口号存在与传输层的TCP或UDP的报文首部,范围在0~65535之间。许多公共服务都使用固定的端口号,例如WWW服务默认使用80号端口,FTP服务默认使用21号端口

39.最一般的地址结构定义为sockaddr结构,它包含了一个2字节的地址族标识符和一个14字节的数组以存储地址

struct sockaddr
{
	ushort sa_family;
	char sa_data[14];
}

40.常用的IPv4地址结构是sockaddr_in,定义如下

typedef 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;
}IN_ADDR,*PIN_ADDR,FAR *LPIN_ADDR

struct sockaddr_in
{
	short sin_family;//地址族,2字节
	u_short sin_port;//端口号,2字节
	struct in_addr sin_addr;//Internet地址,4字节
	char sin_zero[8];//保留字段
}

41.常用的IPv64地址结构是sockaddr_in6,定义如下

typedef struct in6_addr
{
	union
	{
		u_char Byete[16];
		u_short Word[8];
	}u;
}IN6_ADDR,*PIN6_ADDR,FAR *LPIN6_ADDR;

struct sockaddr_in6
{
	short sin6_family;//地址类型,2字节
	u_short sin6_port;//端口号,2字节
	u_long sin6_flowinfo;//流信息,4字节
	struct in6_addr sin6_addr;//IPv6地址,16字节
	u_long sin6_scope_id;//Scope标识,4字节
};

42.addrinfo结构用于描述地址信息,该结构在getaddrinfo()函数中使用,提供了一个以链表形式保存的地址信息

typedef struct addrinfo
{
	int ai_flags;//getaddrinfo函数的调用选项
	int ai_family;//地址族
	int ai_socktype;//套接字类型
	int ai_protocol;//协议
	size_t ai_addrlen;//ai_addr指向的sockaddr结构的缓冲区字节长度
	char *ai_canonname;//主机的正规名称
	struct sockaddr *ai_addr;//以sockaddr结构描述的地址信息
	struct addrinfo *ai_next;//指向下一个addrinfo结构
}ADDRINFOA,*PADDRINFOA;

43.inet_addr()函数能够将IPv4字符形式的点分十进制地址转换为无符号5字节整数形式的地址

44.inet_ntoa()将IPv4的因特网地址转换为因特网标准的点分十进制地址形式,如果正确,返回一个字符指针,指向一块存储着点分十进制格式IP地址的静态缓冲区,否则返回NULL

45.大部分Windows Sockets的函数并不会返回调用失败的原因,通常情况下,一些套接字函数返回0指示操作成功,否则函数返回错误

46.Windows Sockets函数的错误可能有以下几种情况:

①返回SOCKET_ERROR(-1)指示发生了错误

②返回INVALID_SOCKET(0xffff)指示发生了错误

③返回NULL指示发生了错误

为了能够清楚的了解这些函数调用的错误原因,Windows Sockets增加了WSAGetLastError()函数来获得最近一次错误的错误号,定义如下:

int WSAGetLastError(void);