Hello,大家好啊。今天我学习了好多代码啊,写下这份博客的目的呢是为了回顾今天学习到的知识点。在下学识尚浅,如有纰漏,还望祝君不吝赐教。
首先我学习了使用alarm来进行网络超时检测,它在现实中并不常用,这个办法只做了解即可。如果要进行网络超时检测,我更推崇用select函数或者setsockopt的方法来实现,这两种方法会更方便些。
在网络超时检测前,我们需要先了解一下下信号的自重启属性。什么是信号的自重启属性呢?alarm 函数可以设置一个时间,当设置的时间到达之后,会给进程发一个 SIGALRM 信号。进程对SIGALRM的默认行为就是终止进程。那么如果想使用 alarm实现超时检测,就不能使用默认的行为让进程终止,也不能使用忽略的方式所以只能使用捕捉的方式。但是问题又来了,使用捕捉的方式处理SIGALRM信号,当进程阻塞等待对方发来数据的过程中,如果出现了超时会立即执行信号处理函数,执行完信号处理函数后,进程会回到产生信号的位置继续向下执行,这种属性叫信号的自重启属性,如果我们想使用alarm实现超时检测,就得关闭信号的这种属性。
所以我们该怎么关闭信号的自重启属性呢?这里就涉及了函数sigaction了。它的功能是获取和设置信号的行为。头文件是#include<signal.h>,函数原型是int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);以下是它的参数和返回值。
了解了这个函数后,接下来就让我来写个例子来展示使用SIGALRM来实现网络超时检测。
首先是服务端代码。
截图截的不是特别好,还请见谅。接下来是客户端代码。
以上便是我敲得代码了,期望各位大佬的斧正。
学习完网络超时检测后,我们学习了组播和广播。
众所周知,数据包只有一个发送者时就是单播,数据包如果能发送给局域网中的所有主机那就是广播。那么,数据包只能发送给局域网中的部分主机就叫组播。广播只能通过UDP协议哦,一个套接字只能发广播,组播,单播中的一种,如果要发全部的,就要建立三个套接字。
那么广播的地址是什么?以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址,发到该地址的数据包被所有的主机接收,255.255.255.255在所有网段中都代表广播地址 。
广播是如何发给所有主机的?
广播的MAC地址比较特殊: FF:FF:FF:FF:FF:FF
广播的IP地址也比较特殊,是 255.255.255.255 或者局域网中最大的IP地址
当交换机收到这样的数据包的时候
看到目的MAC地址是广播的地址,则就会将该数据包发给局域网的所有主机
每台主机都可以收到广播的数据包
链路层:解析目的MAC地址发现是广播的MAC地址,则允许通过
网络层:解析目的IP地址,发现是广播的IP地址,则也允许通过
只要保证传输层指定的端口号没问题,就可以把数据发到对应的应用进程。
下面是我敲得关于广播的代码。
首先是服务端代码。
然后是客户端代码。
接下来我们来讲一下组播。
由于广播方式发给所有的主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。组播(又称为多播)是一种折中的方式。只有加入某个多播组的主机才能收到数据。多播方式既可以发给多个主机,又能避免象广播那样带来过多的负载。
组播的地址是D类IP地址 224.0.0.1~239.255.255.255 就是组播的地址,D类IP地址的每一个都是一个多播组的IP地址。
下面是我敲得关于组播的代码。
首先是服务端代码。
接下来是客户端代码。
以上便是我今天回顾的内容了,还有很多不足的地方,希望未来能弥补这些不足,知识储备也能变得越来越多。感写你们的观看。