TCPIP网络编程第三章读书笔记

第三章 地址族与数据序列

3.1 分配给套接字的IP地址与端口号

IP指Internet Protocol,是为了传输数据分配给主机的值。

网络地址分为IPV4和IPV6。IPV4是4字节地址族,IPV6是16字节地址族。目前通用的是IPV4。

在向IP地址进行数据传输时,并非一开始就根据全部的IP地址找到目标主机,首先通过网络ID将数据传到目标主机所在网络,网络(路由器)根据主机ID将数据传给目标主机。

但这时还无法传输给最终的应用程序,OS需要把网卡传输到内部的数据分配给套接字,端口号并非赋予计算机的值,而是为区分分配给套接字的序号,OS参考端口号把数据传给套接字。端口号由16位构成,范围是0-65535,0-1023被占用,端口号不能重复,但TCP和UDP不会共用端口号,所以允许重复。

3.2 地址信息的表示

在bind函数中的参数 sockaddr_in如下:

地址族包括AF_INET(IPV4地址),AF_INET6(IPV6地址),AF_LOCAL(本地通信中采用的UNIX协议地址)

端口号和IP地址以网络字节序保存,因为有些OS大端序存储数据,有些OS小端序存储,为了进行统一避免错认,规定网络传输时都以大端序传输

s指的是short,用来转换端口号,l指的是四字节的long类型,用于转换ip。此外可以通过函数转换ip字符串和32位整数型。

3.4 网络地址的初始化与分配

#include <arpa/inet.h>
in_addr_t inet_addr(const char * string);
//成功时返回32位大端整数型值,失败时返回INADDR_NONE。
int inet_aton(const char * string, struct in_addr * addr);
//将转换的32位结果存储在addr中,与inet_addr功能相同,成功时返回1,失败时返回0
char * inet_ntoa(struct in_addr addr);
//与inet_aton过程相反,成功返回字符串地址,失败返回-1
//需要注意的时这个字符串是在内部申请内存保存的,应立即将字符串复制到其他内存,再次调用函数会覆盖掉字符串。

sin_zero必须填充为0,这样就使sockaddr_in拼接起来满足sockaddr。

由此总结的网络地址信息初始化方法如下:

利用INADDR_ANY分配服务器的IP地址,不必亲自输入,并且若同一计算机中分配多个IP,只要端口号一致,就可以从不同IP地址接收数据,但客户端一般不会采用这种方法。

 
posted @ 2022-06-11 15:15  clara-zhang  阅读(58)  评论(0)    收藏  举报