TCP/IP编程之getsockopt/setsockopt函数详解
前述:
有很多方法来获取和设置影响套接字的选项:
· getsockopt和setsockopt函数
· fcntl函数,是把套接字设置为非阻塞式I/O型或者信号驱动式I/O型以及设置套接字属主的POSIX的方式
· ioctl函数
这篇文章只讨论getsockopt和setsockopt函数
函数原型:
GETSOCKOPT(2) Linux Programmer's Manual GETSOCKOPT(2)NAMEgetsockopt, setsockopt - get and set options on socketsSYNOPSIS#include <sys/types.h> /* See NOTES */#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);
返回值:
若成功返回0,若出错返回-1
参数说明(以下文字务必细看):
其中sockfd必须指向一个打开的套接字描述符,level(级别)指定系统中解析选项的代码或为通用套接字代码,或为某个特定于协议的代码(例如IPv4、IPv6、TCP或SCTP)
optval是一个指向某个变量(*optval)的指针,setsockopt从*optval中取得选项代设置的新值,getsockopt则把已获取的选项当前值存放到*optval中。*optval的大小由最后一个参数指定。
下面两个图汇总了TCP编程中常用的可由getsockopt获取或者setsockopt设置的选项。其中的"数据类型"列给出了指针optval必须指向的每个选项的数据类型。我们用后跟一对花括号的记法来表示一个结构,如linger{}表示struct linger。
套接字的选项粗分为两大基本类型:
一是启用或禁止某个特性的二元选项(称为标志选项)。
二是取得并返回我们可以设置或检查的特定值的选项(称为值选项)。
上图中标有"标志"的列指出一个选项是否为标志选项。当给这些标志选项调用getsokopt函数时,*optval是一个整数,*optval中返回的值为0表示相应选项被禁止,不为0表示选项被启用。类似地,setsockopt函数需要一个不为0的*optval值来启用选项,一个为0的*optval值来禁止选项。如果上图中“标志”列不含有“·”,那么相应选项用于在用户进程和系统之间传递所指定数据类型的值。
伪代码,禁用Nagle算法:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
flag = 1;
int ret = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag));
if (ret == -1) { printf("Couldn't setsockopt(TCP_NODELAY)\n");
}
ps:有兴趣的同学,应该把《unix网络编程》·卷1·第七章细看,此文只是摘录了部分内容,并没有对optname的选项做细致的讲解分析。
参考:《unix网络编程》·卷1
TCP/IP编程之getsockopt/setsockopt函数详解相关推荐
- OSI 七层模型和TCP/IP模型及对应协议(详解)
OSI 七层模型和TCP/IP模型及对应协议(详解) 查看全文 http://www.taodudu.cc/news/show-6185847.html 相关文章: OSI7层网络模型协议精析 OSI ...
- TCP/IP网络协议栈:ARP协议详解
<TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...
- 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解
Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...
- TCP/IP协议基本概括+ARP协议详解+DNS协议详解---Linux学习笔记
TCP/IP协议的体系结构: TCP/IP协议族四层模型和OSI七层模型 上层协议使用下层协议的服务,下层协议给上层协议提供一个接口. 四层模型中各个层次的作用和特点 上图说明: 最底层是数据链路层, ...
- Java网络编程之Socket和ServerSocket详解
Socket Socket是实现客户端套接字的类,套接字是两台计算机之间进行通信的端点. Socket的实际工作由SocketImpl类的实例执行 .通过更改用于创建套接字实现的套接字工厂,应用程序可 ...
- Java并发编程之CountDownLatch/CyclicBarrierDemo/SemaphoreDemo详解
CountDownLatch详解 什么是CountDownLatch? 代码说明一 :班长锁门 代码说明二:秦国统一六国 什么是CyclicBarrierDemo? 代码说明一:集齐7个龙珠,召唤神龙 ...
- Android编程之DialogFragment源码详解(一)
DialogFragment是Fragment家族成员之一,如果你把它简单的理解成Dialog,那就错了.它的确可以做作dialog显示,还可以显示出自己定义的Dialog或者AlertDialog, ...
- Android编程之Intent源码详解
Intent源码详解,直接开始入题: Intent源码6700多行代码,但真正核心代码 就那么几百行,大部分都用来定义常量字符串了 先来看一下 public class Intent implemen ...
- Java并发编程之LinkedTransferQueue阻塞队列详解
简介 LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列.相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和tran ...
最新文章
- linux mysql 2003错误代码,如何解决linux mysql2003错误
- shell 中长命令的换行处理
- windows10用c++部署libtorch过程中遇到的一些问题
- 产品经理入门应该怎样学习和成长?
- 你知道socket.io中connect事件和connection事件的区别吗?
- 卷积核_漫画:卷积神经网络中的卷积核到底是什么?
- 叮——这有一打让你666的测试终极资料包,请查收!
- SAP License:COPA计划
- java ztree json_java 树形转换JSON 工具类 / 树形子父级菜单递归 JSON 格式
- python3 logging模块中文乱码_Python logging模块写入中文出现乱码
- spring加载属性(properties)文件
- ora 01033 linux,数据库ORA-01033错误解决办法
- 扁平化设计的色彩选择
- java add方法怎么用_Java ArrayList add() 方法
- RabbitMQ介绍和安装以及当下发展现状
- oracle与u8比较,看网友的用友U8、金蝶K3、SAP、Oracle几大模块比较
- 关于向量的模和向量的范数的理解
- Oxygen PDF Chemistry新功能
- oracle静态游标与动态游标,Oracle 静态 动态游标的使用
- 《OpenSSL3.0学习之二十七 EVP_OpenXXX》
热门文章
- 大数分解Pollard_rho模板
- 公众号如何发布一个投票活动
- 中科院量子计算机芯片,超导量子计算云平台——机会再次来临
- 学无止境的CSS(xHTML+CSS技巧教程资源大全)
- oracle单实例通过dataguard迁移到RAC 转
- 东方博宜OJ 1043 - 【入门】行李托运价格
- 01章 象数易理篇之一
- 如何教幼儿园孩子学10以内的加减法
- php安装扩展错误:Cannot find config.m4. Make sure that you run /usr/local/bin/phpize in the top level sourc
- 基于Vue.js制作的仿车轮驾考通APP端页面