UNP学习第十一章总结, 百度的www.a.shifen.com域名,getaddrinfo小发现

前言

这几周一直要忙着复习矩阵分析的考试,基本把学习的内容拉下来了,抽出一点时间来先把博客更新了吧,因为这一个月考试和项目催促 的关系,我自己定下来的计划已经落后一个月了。。想来真是十分的难过,希望能在考试结束之后赶快赶上来。暑假还想出去见识见识呢。

百度的www.a.shifen.com域名

学习最基础的域名解析函数gethostname之后,自己照着书上代码敲了一遍,然后接上网线来一个个实验我记得的网站,第一个就测试的百度,结果发现baidu.com与www.baidu.com返回来的地址结果居然不同,我尝试在地址栏里直接输入这几个地址,然后都成功进入了百度首页了。然后www.a.shifen.com这个地址输入之后打不开网页,错误内容是ERR_CONNECTION_RESET,原来是服务器发送了一个reset信号回来,看来是百度主动拒绝了服务。
我搜索这个域名的作用,在知乎上看见了两种回答:
1.只是一个CNAME别名记录,用于多线智能解析的,百度为了每条线路(电信、联通/网通、移动等)上的用户都能最快访问站点,所以用了别名记录。
2.shifen.com是百度当年为了竞价排名这个广告系统注册的,这个后台系统被命名为Shifen竞价排名,以前的销售系统现在还叫shifen销售 系统。
大致就是这两种解答,感觉还挺有意思的。

getaddrinfo的方便之处与小技巧
getaddrinfo的可以返回sockaddr结构的数据,那么可以把这个由对方域名服务器返回的数据,直接拿去进行socket编程,可以省去赋值的麻烦。这个是最常用的好处。
第二个好处是在使用hints.ai_flags = AI_PASSIVE的被动调用时。该函数在addrinfo结构体里的sockaddr结构中的值时自己想要设置的结果,即是该函数做的事情实际上是调用了inet_pton函数。省去了自行转换的麻烦。并且兼容ipv6与ipv4。
小技巧
当使用被动模式下,调用该函数时,生成的sockaddr结构体中的端口参数会根据所填写的service名,对应方式是查找/etc/services文件中的端口与服务名的对照表。
例子:
P254中的时间服务器与时间客户端程序,该客户端程序需要手动输入查询的服务器地址和服务名。而服务器需要手动输入需要提供的服务名。
首先使用正常的方式
<span style="font-size:18px;">#daytimetcpsrv1 daytime &
#daytimetcpcli localhost daytime</span>
此时,该服务器函数与客户端程序正常运行,返回了当前时间。此时使用的是13号端口
然后使用:
<span style="font-size:18px;">#daytimetcpsrv1 daytime &
#daytimetcpcli localhost msp</span>
这时由于客户端调用getaddrinfo返回的sockaddr结构中的端口号设置的为18,对应msp的端口。服务器在13号端口,所以返回connection错误,connection refused
再把客户端和服务器端都使用msp服务名
<span style="font-size:18px;">#daytimetcpsrv1 msp &
#daytimetcpcli localhost msp</span>
这时两个程序又可以正常运行了,因为此时都在使用18号端口。

新的注意的点:
<span style="font-size:18px;">malloc (struct A)
malloc (struct A*)</span>
返回的指针指向的内存空间大小是相等的,都等于struct A的大小

你可能感兴趣的:(UNP学习第十一章总结, 百度的www.a.shifen.com域名,getaddrinfo小发现)