我是靠谱客的博主 称心树叶,最近开发中收集的这篇文章主要介绍网络编程:网络超时检测(select poll setsockopt alarm)一、网络超时检测二超时检测的方法:,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、网络超时检测
1.1 概念
阻塞:
以读阻塞为例,如果缓冲区中有内容,则程序正常执行,
如果缓冲区没有内容,程序会一直阻塞,直到有内容,读取内容继续向下运行。
非阻塞:
以读阻塞为例,如果缓冲区中有内容,则程序正常执行,
如果缓冲区没有内容,程序会立即返回,然后继续向下运行。
超时检测:
介于阻塞和非阻塞之间,需要设置一定的时间,如果时间到达之前,缓冲区中没有数据
程序会阻塞,如果时间到了,缓冲区中还没有数据,则程序立即返回,继续向下执行。
二超时检测的方法:
2.3以下所用程序的客户端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define N 128
#define ERRLOG(msg) do{
printf("%s,%s,[%d]n", __FILE__, __func__, __LINE__);
perror(msg);
exit(-1);
}while(0)
int main(int argc, char const *argv[])
{
if (argc != 3){
ERRLOG("输入参数错误n");
}
int socketfd;
if (-1 == (socketfd = socket(AF_INET, SOCK_STREAM, 0))){
ERRLOG("socket fd error");
}
struct sockaddr_in clientaddr;
clientaddr.sin_family = AF_INET;
clientaddr.sin_addr.s_addr = inet_addr(argv[1]);
clientaddr.sin_port = htons(atoi(argv[2]));
socklen_t clientaddr_len = sizeof(clientaddr);
if (-1 == connect(socketfd,(struct sockaddr*)&clientaddr, clientaddr_len)){
ERRLOG("connect error");
}
printf("连接成功...n");
char buff[N];
while (1){
memset(buff, 0, sizeof(buff));
printf("请输入>>");
fgets(buff, N, stdin);
buff[strlen(buff) -1] = '