热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

52-打印套接字选项

为了方便套接字选项的学习,打印套接字选项的值,让我们直观的去感受它的存在是很有必要的。1.程序路径代码托管在gitos上,请使用下面的命令获取:gitclonehttps:

为了方便套接字选项的学习,打印套接字选项的值,让我们直观的去感受它的存在是很有必要的。

1. 程序路径

代码托管在 gitos 上,请使用下面的命令获取:

git clone https://git.oschina.net/ivan_allen/unp.git

如果你已经 clone 过这个代码了,请使用 Git pull 更新一下。本节程序所使用的程序路径是 unp/program/options/showopts

showopts 程序使用了一个名为 showopts 的函数,它位于 unp/program/util 文件夹,这是我提前写好的函数,只要包含了头文件 common.h 即可。

2. showopts 函数

showopts 函数有两个版本:

// 打印指定的套接字描述符的套接字选项
void showopts(int fd, const char* opt);

// 打印默认套接字选项
void showopts(const char* opt);

这两个函数的区别在于,前一个用于打印你指定的套接字选项,第二个用于打印系统创建描述符时默认的选项值。在我们使用的 showopts 程序中,使用了第二个函数。第一个函数后面我们会遇到的。

  • 两个参数的版本

第一个参数需要你自己传递一个描述符,第二个参数可以为 NULL,表示打印所有选项的值,如果不空,只打印参数指定的套接字选项的值。比如:

showopts(sockfd, "SO_LINGER"); //打印的结果就是 SO_LINGER 选项的值。
  • 一个参数版本

它只有一个参数,如果该参数为 NULL,打印所有的套接字选项默认值,如果不空,只打印参数指定的套接字选项的值。比如

showopts("SO_REUSEADDR") //打印的结果就是 SO_REUSEADDR 选项的值。

3. showopts 程序
  • 版本一:使用两个参数
 /*
* 说明:如果提示缺少 netinet/sctp.h 文件,说明你的系统没有相关的 sctp 开发环境,按照下面的方式安装:
*
* ubuntu: sudo apt-get install libsctp-dev
* centos : sudo yum install lksctp-tools-devel.x86_64
* 或者 sudo yum install lksctp-tools-devel.i686
*/


#include "common.h"

int main(int argc, char* argv[]) {
int i, sockfd;
// 自己创建一个套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (argc > 1) {
for (i = 1; i showopts(sockfd, argv[i]);
}
}
else {
showopts(sockfd, NULL);
}
close(sockfd);
return 0;
}
  • 版本二:使用一个参数
// showopts_v2.cc
#include "common.h"

int main(int argc, char* argv[]) {
int i;
if (argc > 1) {
for (i = 1; i showopts(argv[i]);
}
}
else {
showopts(NULL);
}
return 0;
}

4. 程序运行结果


这里写图片描述
图1 版本一

我们发现,我们自己申请的 TCP 协议套接字对有些选项是不支持的。


这里写图片描述
图1 版本二

版本二这个函数未来并不能被我们采用,因为它打印的是系统默认值。

5. 总结
  • 掌握 showopts 函数的使用方法

推荐阅读
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
author-avatar
热情连心锁426
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有