前述:

有很多方法来获取和设置影响套接字的选项:

· getsockoptsetsockopt函数

· fcntl函数,是把套接字设置为非阻塞式I/O型或者信号驱动式I/O型以及设置套接字属主的POSIX的方式

· ioctl函数

这篇文章只讨论getsockoptsetsockopt函数

函数原型:

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函数详解相关推荐

  1. OSI 七层模型和TCP/IP模型及对应协议(详解)

    OSI 七层模型和TCP/IP模型及对应协议(详解) 查看全文 http://www.taodudu.cc/news/show-6185847.html 相关文章: OSI7层网络模型协议精析 OSI ...

  2. TCP/IP网络协议栈:ARP协议详解

    <TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...

  3. 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解

    Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...

  4. TCP/IP协议基本概括+ARP协议详解+DNS协议详解---Linux学习笔记

    TCP/IP协议的体系结构: TCP/IP协议族四层模型和OSI七层模型 上层协议使用下层协议的服务,下层协议给上层协议提供一个接口. 四层模型中各个层次的作用和特点 上图说明: 最底层是数据链路层, ...

  5. Java网络编程之Socket和ServerSocket详解

    Socket Socket是实现客户端套接字的类,套接字是两台计算机之间进行通信的端点. Socket的实际工作由SocketImpl类的实例执行 .通过更改用于创建套接字实现的套接字工厂,应用程序可 ...

  6. Java并发编程之CountDownLatch/CyclicBarrierDemo/SemaphoreDemo详解

    CountDownLatch详解 什么是CountDownLatch? 代码说明一 :班长锁门 代码说明二:秦国统一六国 什么是CyclicBarrierDemo? 代码说明一:集齐7个龙珠,召唤神龙 ...

  7. Android编程之DialogFragment源码详解(一)

    DialogFragment是Fragment家族成员之一,如果你把它简单的理解成Dialog,那就错了.它的确可以做作dialog显示,还可以显示出自己定义的Dialog或者AlertDialog, ...

  8. Android编程之Intent源码详解

    Intent源码详解,直接开始入题: Intent源码6700多行代码,但真正核心代码 就那么几百行,大部分都用来定义常量字符串了 先来看一下 public class Intent implemen ...

  9. Java并发编程之LinkedTransferQueue阻塞队列详解

    简介 LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列.相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和tran ...

最新文章

  1. linux mysql 2003错误代码,如何解决linux mysql2003错误
  2. shell 中长命令的换行处理
  3. windows10用c++部署libtorch过程中遇到的一些问题
  4. 产品经理入门应该怎样学习和成长?
  5. 你知道socket.io中connect事件和connection事件的区别吗?
  6. 卷积核_漫画:卷积神经网络中的卷积核到底是什么?
  7. 叮——这有一打让你666的测试终极资料包,请查收!
  8. SAP License:COPA计划
  9. java ztree json_java 树形转换JSON 工具类 / 树形子父级菜单递归 JSON 格式
  10. python3 logging模块中文乱码_Python logging模块写入中文出现乱码
  11. spring加载属性(properties)文件
  12. ora 01033 linux,数据库ORA-01033错误解决办法
  13. 扁平化设计的色彩选择
  14. java add方法怎么用_Java ArrayList add() 方法
  15. RabbitMQ介绍和安装以及当下发展现状
  16. oracle与u8比较,看网友的用友U8、金蝶K3、SAP、Oracle几大模块比较
  17. 关于向量的模和向量的范数的理解
  18. Oxygen PDF Chemistry新功能
  19. oracle静态游标与动态游标,Oracle 静态 动态游标的使用
  20. 《OpenSSL3.0学习之二十七 EVP_OpenXXX》

热门文章

  1. 大数分解Pollard_rho模板
  2. 公众号如何发布一个投票活动
  3. 中科院量子计算机芯片,超导量子计算云平台——机会再次来临
  4. 学无止境的CSS(xHTML+CSS技巧教程资源大全)
  5. oracle单实例通过dataguard迁移到RAC 转
  6. 东方博宜OJ 1043 - 【入门】行李托运价格
  7. 01章 象数易理篇之一
  8. 如何教幼儿园孩子学10以内的加减法
  9. php安装扩展错误:Cannot find config.m4. Make sure that you run /usr/local/bin/phpize in the top level sourc
  10. 基于Vue.js制作的仿车轮驾考通APP端页面