首页 > 编程语言 >网络编程(setsockopt、超时检测)

网络编程(setsockopt、超时检测)

时间:2024-09-12 22:52:50浏览次数:10  
标签:setsockopt int IP 编程 广播 SO 接字 超时 sigaction

【1】setsockopt:设置套接字属性

set:设置 sock:套接字 option:属性

int setsockopt(int sockfd,int level,int optname,void *optval,socklen_t optlen)
功能:获得/设置套接字属性
参数:
sockfd:套接字描述符
level:协议层
optname:选项名
optval:选项值
optlen:选项值大小
返回值:     成功 0                  失败-1

socket属性(int 类型中 允许则为1或其他值 , 不允许则为0)

选项名称

说明

数据类型

========== SOL_SOCKET 应用层 ===========

SO_BROADCAST

允许发送广播数据

int

SO_DEBUG

允许调试

int

SO_DONTROUTE

不查找路由

int

SO_ERROR

获得套接字错误

int

SO_KEEPALIVE

保持连接

int

SO_LINGER

延迟关闭连接

struct linger

SO_OOBINLINE

带外数据放入正常数据流

int

SO_RCVBUF

接收缓冲区大小

int

SO_SNDBUF

发送缓冲区大小

int

SO_RCVLOWAT

接收缓冲区下限

int

SO_SNDLOWAT

发送缓冲区下限

int

SO_RCVTIMEO

接收超时

struct timeval

SO_SNDTIMEO

发送超时

struct timeval

SO_REUSEADDR

允许重用本地地址和端口

int

SO_TYPE

获得套接字类型

int

SO_BSDCOMPAT

与BSD系统兼容

int

========== IPPROTO_IP IP层/网络层 =============

IP_HDRINCL

在数据包中包含IP首部

int

IP_OPTINOS

IP首部选项

int

IP_TOS

服务类型

int

IP_TTL

生存时间

int

IP_ADD_MEMBERSHIP

将指定的IP加入多播组

struct ip_mreq

========== IPPRO_TCP 传输层 ============

TCP_MAXSEG

TCP最大数据段的大小

int

TCP_NODELAY

不使用Nagle算法

int

设置地址重用

【2】超时检测

必要性

  1. 避免进程进入无限制的阻塞
  2. 在规定的时间内未完成相应的语句,可以执行其他的语句

超时检测的设置方法

1.通过函数自带的参数设置

select poll

2.通过设置套接字属性进行设置

3.alarm函数与sigaction函数结合

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
功能:对接收到的指定信号处理
参数:signum:要捕获的信号
	act:接收到信号之后对信号进行处理的结构体
	oldact:接收到信号之后,保存原来对此信号处理的各种方式与信号(可用来做备份)。如果不需要备份,
    此处可以填NULL
struct sigaction 
{
    void     (*sa_handler)(int); //信号处理函数
    void     (*sa_sigaction)(int, siginfo_t *, void *);  //查看信号的各种详细信息
    sigset_t   sa_mask;
    int        sa_flags;      //信号属性; SA_RESTART自重启属性
#define SA_RESTART  0x10000000
    void     (*sa_restorer)(void);//不再使用
   };     
    //设置信号属性
    struct sigaction act;
    sigaction(SIGALRM,NULL,&act);//获取原属性
    act.sa_handler=handler;//修改属性
    sigaction(SIGALRM,&act,NULL);//将修改的属性设置回去
返回值:
	成功:0
	出错:-1,并将errno设置为指示错误

【3】广播与组播(broadcast & multicast)

1.广播(udp)

理论:

● 前面介绍的数据包发送方式只有一个接受方,称为单播

● 如果同时发给局域网中的所有主机,称为广播

● 只有用户数据报(使用UDP协议)套接字才能广播

● 一般被设计成局域网搜索协议

●广播地址:局域网中主机号最大的一个 192.168.50.255

发送者

1.创建数据报套接字

2.由于原本的套接字不允许广播,所以要设置广播属性

3.指定网络信息(接收者)

4.发送消息

5.关闭套接字

接收者

1.创建数据报套接字

2.指定网络信息(接收者)

3.绑定套接字

4.接收消息

5.关闭套接字

缺点:

广播方式发给所有的主机,过多的广播会大量的占用网络带宽,造成广播风暴,影响正常的通信

广播风暴: 网络长时间被大量的广播数据包所占用,使正常的点对点通信无法正常进行,其外在表现为网络速度奇慢无比,甚至导致网络瘫痪

标签:setsockopt,int,IP,编程,广播,SO,接字,超时,sigaction
From: https://blog.csdn.net/2301_77143270/article/details/142149048

相关文章

  • 0910-0911 shell编程与基础算法(leetCode )
    栈的定义栈(Stack),也称为堆栈,它是一种特殊的线性表,只允许在表的一端进行插入和删除操作。允许在表操作的一端称为栈顶(Top),另一端称为栈底(Bottom)。栈顶是动态变化的,它由一个称为栈顶指针(top)的变量指示。当表中没有元素时,称为空栈。栈的插入操作称为入栈或进栈,删除操作称为出栈或......
  • day09(网络编程基础)服务器模型
    目录服务器模型循环服务器并发服务器多进程多线程​​​​​​​IO多路复用​​​​​​​并发服务器总结服务器模型在网络通信中,通常一个服务器要连接多个客户端为了处理多个客户端的请求,通常有多种表现形式循环服务器一个服务器在同一时间只能处理一个客户......
  • ##嵌入式学习之Linux系统编程##--标准I/O函数
    day01主要内容:linux系统下一切皆文件标准IO---标准库文件IO---系统调用制作库---静态库、动态库基本概念:标准I/O:文件:一组相关数据的有序集合。文件名:这个数据集合的名称。文件类型:lsp-bcd系统调用用户空间进程访问内核的接口把用户从底层的硬件编程......
  • Python3 学习笔记6-os 模块、错误和异常、面向对象编程、类的专有方法、命名空间和作
    目录一、os模块: 常用方法: 二、错误和异常:(1)语法错误:(2)异常:(3)异常处理:(4)抛出异常:(5)用户自定义异常:(6)清理行为:(7)with语句:三、面向对象编程: (1)类和对象:(2)继承:(3)封装:(4)多态:(5)运算符重载: 四、类的专有方法:(1)__init__(self,...):(2)__del__(self):(3)__repr__(self):(4)__set......
  • 1765asp.net古镇旅游网站VS开发sqlserver数据库web结构c#编程web网页设计
    博主介绍:专注于Java.net phpphython 小程序等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟我的博客空间发布了1000+毕设题目方便大家学习使用感兴趣的可以先收藏起来,还有大家在......
  • C语言简单编程题(思路+源码)
    C语言简单编程题(思路+源码)【一】题目一:1.字符串的逆序(如abcdef–>fedcba)思路:首先我们用strlen()函数来获得字符串的长度,用left来表示下标为零的元素,用right来表示最后一个字符的下标,创建第三个变量,交换第一个和最后一个的元素,再left++,right–,后面的依次类推。2.代码实......
  • 程序员副业推荐专题—如果利用AI来翻译原版英文编程书籍
    一、准备工作获取原版英文编程书籍:可以从电子书商店(如AmazonKindleStore)购买电子书版本,或者从图书馆、书店等获取实体书。如果书籍有电子版,特别是EPUB、MOBI等格式,将更方便后续处理。选择AI翻译工具:市场上有多种AI翻译工具可供选择,如DeepL、GoogleTranslate......
  • Cursor:倍增工作效率的编程工具
    哪个编程工具让你的工作效率翻倍?在现代开发中,选择一个合适的编程工具能够显著提升工作效率。Cursor编译器以其简洁的界面、智能化的代码功能和灵活的插件系统,帮助开发者更高效地编写、检查和优化代码。本文将详细介绍Cursor的功能特点、使用场景,特别是它如何通过人工智......
  • 【编程底层原理】String常量池和String.intern()
    一、String常量池String常量池(StringPool)是Java中的一个特殊内存区域,用于存储字符串常量。它的主要目的是优化程序的性能和内存使用,具体体现在以下几个方面:1、字符串重用:当程序中多次出现相同的字符串字面量时,它们都会被存储在String常量池中。由于常量池的唯一性,相同的......
  • 【编程基础知识】mysql中的insert into ... on DUPLICATE key和replace into的性能对
    一、概述在MySQL中,INSERTINTO...ONDUPLICATEKEYUPDATE和REPLACEINTO都是用来处理插入或更新数据的语句,但它们在性能和行为上有所不同。二、REPLACEINTOREPLACEINTO语句在遇到唯一键或主键冲突时,会先删除旧记录,然后插入新记录。这意味着它会执行两次操作:删除......