网络编程(七)网络超时检测

2024-06-21 01:52
文章标签 检测 编程 网络 超时

本文主要是介绍网络编程(七)网络超时检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、概念
  • 二、实现方式
    • (一) 使用select实现超时检测
      • 1. select函数补充说明:
      • 2. 使用示例
      • 3. 输出结果
    • (二) 使用setsockopt函数
      • 1. 函数定义
      • 2. 获取发送缓冲区和接收缓冲区的大小
      • 3. 端口复用
      • 4. 设置超时时间
    • (三) alarm
      • 1. 相关概念
      • 2. sigaction

一、概念

介于阻塞和非阻塞之间,可以自己设置一个时间,在设置的时间内,如果没数据就阻塞等待,如果设置的时间到了还没数据,则立即切换为非阻塞。

二、实现方式

(一) 使用select实现超时检测

1. select函数补充说明:

#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);其中 最后一个参数 timeout 就是超时时间NULL 永久阻塞 直到就绪为止也可以使用下面的结构体指定超时时间struct timeval {long    tv_sec;         /* 秒 */long    tv_usec;        /* 微秒 */};如果结构体的两个成员都为 0  则表示非阻塞返回值:成功 就绪的文件描述符个数失败 -1 重置错误码超时  0
  • 注:
  • select采用倒计时方式计时,如果在循环中使用,需要每次重置时间
  • 超时时,select会返回0

2. 使用示例

#include <my_head.h>int main(int argc, char const *argv[])
{if(3 != argc){printf("Usage:%s Ipv4 port\n",argv[0]);exit(-1);}//创建套接字int sockfd=0;if(-1 ==(sockfd = socket(AF_INET,SOCK_STREAM,0))){ERR_LOG("socket error");}//填充结构体struct sockaddr_in serveraddr;serveraddr.sin_family=AF_INET;serveraddr.sin_addr.s_addr=inet_addr(argv[1]);serveraddr.sin_port=htons(atoi(argv[2]));socklen_t serverlen = sizeof(serveraddr);//绑定if(-1 == bind(sockfd,(struct sockaddr *)&serveraddr,serverlen)){ERR_LOG("bind error");}//开启监听if(-1 ==listen(sockfd,5)){ERR_LOG("listen error");}//创建集合fd_set readfds;FD_ZERO(&readfds);fd_set tempfds;FD_ZERO(&tempfds);int acceptfd=0;int max_fd=0;int ret=0;int i=0;int nbytes=0;char buff[128]={0};//将套接字加入集合FD_SET(sockfd,&readfds);max_fd=max_fd>sockfd?max_fd:sockfd;struct timeval tm;while(1){tm.tv_sec=5;tm.tv_usec=0;tempfds = readfds;if(-1 == (ret = select(max_fd+1,&tempfds,NULL,NULL,&tm))){ERR_LOG("select error");}else if(0 == ret){printf("已经五秒没有fd就绪了\n");continue;}printf("有fd就绪\n");//说明有fd就绪了,判断是不是sockfdfor(i=3;i<max_fd+1 && 0<ret;i++){//先判断是不是这个fd就绪了if(FD_ISSET(i,&tempfds)){ret--;//判断就绪的fd是不是sockfdif(sockfd == i){//说明有新的客户端接入if(-1 == (acceptfd = accept(i,NULL,NULL))){ERR_LOG("accept error");}//将新的acceptfd加入集合FD_SET(acceptfd,&readfds);max_fd=max_fd>acceptfd?max_fd:acceptfd;printf("用户[%d]连接\n",i);}else{//说明是已连接的客户端要通信printf("接收到用户[%d]的消息\n",i);if(-1 == (nbytes = recv(i,buff,sizeof(buff),0))){ERR_LOG("recv error");}else if(0 == nbytes){printf("用户[%d]断开连接\n",i);//从集合中删除FD_CLR(i,&readfds);close(i);continue;}if(!strcmp(buff,"quit")){//用户退出printf("用户[%d]退出\n",i);//从集合中删除FD_CLR(i,&readfds);close(i);continue;}//正常数据处理printf("用户[%d]发送消息[%s]\n",i,buff);strcat(buff,"T^T");if(-1 == send(i,buff,sizeof(buff),0)){ERR_LOG("send error");}}}}} close(sockfd);return 0;
}

3. 输出结果

在这里插入图片描述

(二) 使用setsockopt函数

1. 函数定义

#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);功能:设置或者获取套接字属性
参数:sockfd:要操作的套接字level:选项的级别套接字API级别  SOL_SOCKETTCP级别       IPPROTO_TCPIP级别        IPPROTO_IPoptname:选项的名字套接字API级别SO_BROADCAST  允许发送广播SO_RCVBUF     接收缓冲区的大小SO_SNDBUF     发送缓冲区的大小SO_RCVTIMEO   接收超时时间参数是一个 struct timeval 结构体如果超时了 调用会返回-1 错误码 为 EAGAINSO_SNDTIMEO   发送超时时间SO_REUSEADDR  允许端口复用TCP级别TCP_NODELAY   关闭Nagle算法IP级别IP_ADD_MEMBERSHIP  设置加入多播组optval:选项的值,没有特殊说明时,一般是int型指针;1打开;0关闭optlen:optval的长度
返回值:成功 0失败  -1 重置错误码
  • 注:如果参数没有特殊说明,一般是int型

2. 获取发送缓冲区和接收缓冲区的大小

#include <my_head.h>int main(int argc, char const *argv[])
{int sockfd=0;if(-1 == (sockfd = socket(AF_INET,SOCK_STREAM,0))){ERR_LOG("socket error");}int snd_buff_size = 0;int snd_buff_size_len = sizeof(snd_buff_size);if(-1 == getsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,&snd_buff_size,&snd_buff_size_len)){ERR_LOG("getsockopt error");}printf("Sendbuff:%dKB\n",snd_buff_size/1024);int recv_buff_size = 0;int recv_buff_size_len = sizeof(recv_buff_size);if(-1 == getsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&recv_buff_size,&recv_buff_size_len)){ERR_LOG("getsockopt error");}printf("Recvbuff:%dKB\n",recv_buff_size/1024);return 0;
}

输出结果:
在这里插入图片描述

  • 注:默认 发送缓冲区16k,接收缓冲区128k。

3. 端口复用


4. 设置超时时间


(三) alarm

1. 相关概念

2. sigaction

这篇关于网络编程(七)网络超时检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079877

相关文章

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

基于深度学习的轮廓检测

基于深度学习的轮廓检测 轮廓检测是计算机视觉中的一项关键任务,旨在识别图像中物体的边界或轮廓。传统的轮廓检测方法如Canny边缘检测和Sobel算子依赖于梯度计算和阈值分割。而基于深度学习的方法通过训练神经网络来自动学习图像中的轮廓特征,能够在复杂背景和噪声条件下实现更精确和鲁棒的检测效果。 深度学习在轮廓检测中的优势 自动特征提取:深度学习模型能够自动从数据中学习多层次的特征表示,而不需要