一、网络超时检测
在网络通信过程中,经常会出现不可预知的各种情况。例如网络线路突发故障、通信一方异常结束等。一旦出现上述情况,很可能长时间都不会收到数据,而且无法判断是没有数据还是数据无法到达。如果使用的是TCP协议,可以检测出来;但如果使用UDP协议的话,需要在程序中进行相关检测。所以,为避免进程在没有数据时无限制的阻塞,使用网络超时检测很有必要。
1、套接字接收超时检测
这里先介绍设置套接字选项的函数 setsockopt() 函数:
所需头文件 | #include <sys/types.h> #include <sys/socket.h> |
函数原型 | int setsockopt (int sockfd, int level, int optname, const void *optval, socklen_t optlen ); |
函数参数 | sockfd:套接字描述符 level:选项所属协议层 optval:保存选项值的缓冲区 optlen:选项值的长度 |
函数返回值 | 成功:0 出错:-1,并设置 errno |
下面是套接字常用选项及其说明:
LEVEL:SOL_SOCKET
选项名称 | 说明 | 数据类型 |
SO_BROADCAST | 允许发送广播数据 | int |
SO_DEBUG | 允许调试 | int |
SO_DONTRUOTE | 不查找路由 | int |
SO_ERROR | 获得套接字错误 | int |
SO_KEEPALIVE | 保持连接 | int |
SO_LINGER | 延迟关闭连接 | struct linger |
SO_OOBINLINE | 带外数据放入正常数据流 | int |
SO_RCVBUF | 接收缓冲区大小 | int |
SO_SNDBUF | 发送缓冲区大小 | int |
SO_RCVTIMEO | 接收超时 | struct timeval |
SO_SNDTIMEO | 发送超时 | struct timeval |
SO_REUSERADDR | 允许重用本地地址和端口 | int |
SO_TYPE | 获得套接字类型 | int |
下面利用SO_RCVTIMEO的选项实现套接字的接收超时检测:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define N 64
#define PORT 8888
int main()
{
int sockfd;
char buf[N];
struct sockaddr_in seraddr;
struct timeval t = {6, 0};
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket error");
exit(-1);
}
else
{
printf(&#