内容正文:
第10章 网络高级编程
网路超时检测
广播
组播
UNIX域套接字
原始套接字
网络超时检测
广播
10.2
10.1
☞点击查看本小节知识架构
☞点击查看本小节知识架构
组播
UNIX域套接字
10.4
10.3
☞点击查看本小节知识架构
☞点击查看本小节知识架构
原始套接字
10.5
☞点击查看本小节知识架构
学习目标
掌握
掌握
掌握
掌握
掌握网络超时检测的编程方法
1
掌握原始套接字的创建及帧数据的发送与接收方法
4
2
掌握广播、组播的概念及设置流程
3
掌握UNIX域套接字的编程方法
销售额 掌握知识 理解知识 熟悉知识 了解知识 2.5 2.5 2.5 2.5
本章将对前面章节涉及的网络知识做更加深入的讨论。从编程角度来看,本章内容属于重点及难点。首先介绍在网络编程中设置超时检测的方法,即通过设置属性、多路复用以及定时器分别来实现网络超时检测。然后介绍向局域网中所有主机发送数据的方式(广播)以及只向一些特定主机发送数据的方式(组播);再在流式、数据报套接字实现网络通信的基础上介绍这两种套接字如何实现本地通信,也就是UNIX域套接字的编程问题;最后介绍第三种类型套接字——原始套接字,并实现数据接收与发送。本章内容有一定难度,望读者仔细研读。
10.1 网络超时检测
10.1.1
setsockopt()函数实现超时检测
返回目录
10.1.2
select()函数实现超时检测
10.1.3
定时器超时检测
10.1 网络超时检测
在网络编程中,创建好套接字以后以阻塞的方式进行读写操作,如果没有数据准备就绪的话,程序会一直阻塞。在实际网络通信中,经常会出现各种不可预支的情况。例如,网络线路突发故障,通信一方异常结束等。一旦产生上述情况,很可能很长时间无法收到数据,且无法判断是没有数据还是数据无法到达。因此在程序中有必要对这种情况进行检测,从而及时做出响应。如果使用的是TCP,可以检测出来。但如果使用UDP的话,则需要在程序中进行相关检测。这种检测可以称为超时检测,其可以有效地避免进程在没有数据时无限制地阻塞,当设定的时间到时,进程将从原操作返回继续运行。
10.1.1 setsockopt()函数实现超时检测
10.1 网络超时检测
设置超时检测,可以使用setsockopt()函数。用于获取和设置套接字选项的getsockopt()函数和setsockopt()函数。
10.1.1 setsockopt()函数实现超时检测
#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
setsockopt()函数用来设置网络属性。其中,参数sockfd表示套接字描述符,参数level表示选项所属协议层,而optname表示选项的名称。参数optval用来保存选项值,optlen为选项值的长度。getsockopt()函数的参数与上述一致。
10.1 网络超时检测
套接字常用选项及说明如表所示。
10.1.1 setsockopt()函数实现超时检测
10.1 网络超时检测
当以上两个函数第三个参数optname设置为SO_RCVTIMEO或SO_SNDTIMEO时可以实现超时检测,超时时间通过第四个参数设定,其值的类型为struct timeval,struct timeval中成员如下。
10.1.1 setsockopt()函数实现超时检测
struct timeval {
__kernel_time_t tv_sec; /* seconds */ 秒
__kernel_suseconds_t tv_usec; /* microseconds */ 微秒
};
因此可设计服务器端代(不需客户端,主要为了测试超时问题),实现套接字的接收超时检测,参见教材例10-1。
10.1 网络超时检测
例10-1在接收数据前设置了5s的数据接收超时,如果5s之内没有数据包到来,程序会从recvfrom()函数返回,进行相应的错误处理。
运行结