代码改变世界

第三章 套接字编程简介

2017-11-06 22:00  szn好色仙人  阅读(148)  评论(0编辑  收藏  举报
//1.
IPv4地址和TCP、UDP端口号在套接字地址结构中总是以网络字节序来存储的
套接字字体结构在两个方向上进行传递:从进程到内核和从内核到进程


//2.
小端:低序字节存储在起始位置
大端:高序字节存储在起始位置
主机字节序:即某个给定的系统使用的字节序,即可能是小端,也可能是大端,常见的一般是小端
网络字节序:大端模式

主机字节序与网络字节序转换函数:
htons
htonl
ntohs
ntohl
当使用以上函数时候,我们并不关心主机字节序和网络字节序的真实情况,我们要做的只是调用适当的函数进行转换,
在网络字节序与主机字节序相同的机器上,这四个函数被定义为空宏


//3.
inet_addr:将点分十进制字符串转为32位网络字节序值,该函数存在一个问题:
	当该函数出错的时候,返回 INADDR_NONE ,这就意味着 255.255.255.255 无法由此函数进行处理,
	因为此值被解释为函数调用失败,如今此函数已被废弃,最好不用
	#define INADDR_NONE             0xffffffff

	int nValue = inet_addr("");		//nValue = 0xffffffff

inet_pton:将第二个参数所指的字符串转为相应的数值结果,支持IPv4,IPv6。失败返回0,成功返回1,
	定义于头文件 WS2tcpip.h 中,头文件 WS2tcpip.h 中 有 #include <winsock2.h> 语句
	int nRe = inet_pton(AF_INET, "1.2.3.4", &sockAddr.sin_addr.s_addr);	//nRe = 1	S_addr = 0x04030201

inet_ntop:执行和 inet_pton 相反的转换
	执行成功,返回传入的缓冲区的字符串,若传入缓冲区长度不足,返回空指针
	char buff[16] = {};	//buff = 0x003af720
	auto pStr0 = inet_ntop(AF_INET, &sockAddr.sin_addr.s_addr, buff, 16); //pStr0= 0x003af720 "1.2.3.4"
	auto pStr1 = inet_ntop(AF_INET, &sockAddr.sin_addr.s_addr, buff, 1);  //pStr1 = 0x00000000


//4.
字节流套接字上调用 read 和 write 输入或输出的字节数可能比请求的数量少,然而这不是出错的状态。
上述现象的原因是在于内核中用于套接字的缓冲区可能已到达了极限。此时需要再次调用 read 或者 write 以输入输出剩余字节
上述现象在 read 一个字节流套接字时很常见,但是在 write 一个字节流套接字时,只在将套接字设为非阻塞时才会出现