代码来源:《UNIX网络编程 卷1:套接字联网API》

说明:为以后查看套接字默认值使用

代码:

  1 /* include checkopts1 */
  2 /* *INDENT-OFF* */
  3
  4 #include <netinet/tcp.h>        /* for TCP_xxx defines */
  5 #include <stdio.h>
  6 #include <string.h>
  7 #include <stdlib.h>
  8 #include <fcntl.h>
  9 #include <sys/types.h>
 10 #include <sys/socket.h>
 11 #include <arpa/inet.h>
 12 #include <unistd.h>
 13 #include <signal.h>
 14 #include <sys/time.h>
 15 #include <time.h>
 16 #include <sys/epoll.h>
 17
 18 union val {
 19   int                i_val;
 20   long                l_val;
 21   struct linger        linger_val;
 22   struct timeval    timeval_val;
 23 } val;
 24
 25 static char    *sock_str_flag(union val *, int);
 26 static char    *sock_str_int(union val *, int);
 27 static char    *sock_str_linger(union val *, int);
 28 static char    *sock_str_timeval(union val *, int);
 29
 30 struct sock_opts {
 31   const char       *opt_str;
 32   int        opt_level;
 33   int        opt_name;
 34   char   *(*opt_val_str)(union val *, int);
 35 } sock_opts[] = {
 36     { "SO_BROADCAST",        SOL_SOCKET,    SO_BROADCAST,    sock_str_flag },
 37     { "SO_DEBUG",            SOL_SOCKET,    SO_DEBUG,        sock_str_flag },
 38     { "SO_DONTROUTE",        SOL_SOCKET,    SO_DONTROUTE,    sock_str_flag },
 39     { "SO_ERROR",            SOL_SOCKET,    SO_ERROR,        sock_str_int },
 40     { "SO_KEEPALIVE",        SOL_SOCKET,    SO_KEEPALIVE,    sock_str_flag },
 41     { "SO_LINGER",            SOL_SOCKET,    SO_LINGER,        sock_str_linger },
 42     { "SO_OOBINLINE",        SOL_SOCKET,    SO_OOBINLINE,    sock_str_flag },
 43     { "SO_RCVBUF",            SOL_SOCKET,    SO_RCVBUF,        sock_str_int },
 44     { "SO_SNDBUF",            SOL_SOCKET,    SO_SNDBUF,        sock_str_int },
 45     { "SO_RCVLOWAT",        SOL_SOCKET,    SO_RCVLOWAT,    sock_str_int },
 46     { "SO_SNDLOWAT",        SOL_SOCKET,    SO_SNDLOWAT,    sock_str_int },
 47     { "SO_RCVTIMEO",        SOL_SOCKET,    SO_RCVTIMEO,    sock_str_timeval },
 48     { "SO_SNDTIMEO",        SOL_SOCKET,    SO_SNDTIMEO,    sock_str_timeval },
 49     { "SO_REUSEADDR",        SOL_SOCKET,    SO_REUSEADDR,    sock_str_flag },
 50 #ifdef    SO_REUSEPORT
 51     { "SO_REUSEPORT",        SOL_SOCKET,    SO_REUSEPORT,    sock_str_flag },
 52 #else
 53     { "SO_REUSEPORT",        0,            0,                NULL },
 54 #endif
 55     { "SO_TYPE",            SOL_SOCKET,    SO_TYPE,        sock_str_int },
 56     //{ "SO_USELOOPBACK",        SOL_SOCKET,    SO_USELOOPBACK,    sock_str_flag },
 57     { "IP_TOS",                IPPROTO_IP,    IP_TOS,            sock_str_int },
 58     { "IP_TTL",                IPPROTO_IP,    IP_TTL,            sock_str_int },
 59 #ifdef    IPV6_DONTFRAG
 60     { "IPV6_DONTFRAG",        IPPROTO_IPV6,IPV6_DONTFRAG,    sock_str_flag },
 61 #else
 62     { "IPV6_DONTFRAG",        0,            0,                NULL },
 63 #endif
 64 #ifdef    IPV6_UNICAST_HOPS
 65     { "IPV6_UNICAST_HOPS",    IPPROTO_IPV6,IPV6_UNICAST_HOPS,sock_str_int },
 66 #else
 67     { "IPV6_UNICAST_HOPS",    0,            0,                NULL },
 68 #endif
 69 #ifdef    IPV6_V6ONLY
 70     { "IPV6_V6ONLY",        IPPROTO_IPV6,IPV6_V6ONLY,    sock_str_flag },
 71 #else
 72     { "IPV6_V6ONLY",        0,            0,                NULL },
 73 #endif
 74     { "TCP_MAXSEG",            IPPROTO_TCP,TCP_MAXSEG,        sock_str_int },
 75     { "TCP_NODELAY",        IPPROTO_TCP,TCP_NODELAY,    sock_str_flag },
 76 #ifdef    SCTP_AUTOCLOSE
 77     { "SCTP_AUTOCLOSE",        IPPROTO_SCTP,SCTP_AUTOCLOSE,sock_str_int },
 78 #else
 79     { "SCTP_AUTOCLOSE",        0,            0,                NULL },
 80 #endif
 81 #ifdef    SCTP_MAXBURST
 82     { "SCTP_MAXBURST",        IPPROTO_SCTP,SCTP_MAXBURST,    sock_str_int },
 83 #else
 84     { "SCTP_MAXBURST",        0,            0,                NULL },
 85 #endif
 86 #ifdef    SCTP_MAXSEG
 87     { "SCTP_MAXSEG",        IPPROTO_SCTP,SCTP_MAXSEG,    sock_str_int },
 88 #else
 89     { "SCTP_MAXSEG",        0,            0,                NULL },
 90 #endif
 91 #ifdef    SCTP_NODELAY
 92     { "SCTP_NODELAY",        IPPROTO_SCTP,SCTP_NODELAY,    sock_str_flag },
 93 #else
 94     { "SCTP_NODELAY",        0,            0,                NULL },
 95 #endif
 96     { NULL,                    0,            0,                NULL }
 97 };
 98 /* *INDENT-ON* */
 99 /* end checkopts1 */
100
101 /* include checkopts2 */
102 int
103 main(int argc, char **argv)
104 {
105     int                    fd;
106     socklen_t            len;
107     struct sock_opts    *ptr;
108
109     for (ptr = sock_opts; ptr->opt_str != NULL; ptr++) {
110         printf("%s: ", ptr->opt_str);
111         if (ptr->opt_val_str == NULL)
112             printf("(undefined)\n");
113         else {
114             switch(ptr->opt_level) {
115             case SOL_SOCKET:
116             case IPPROTO_IP:
117             case IPPROTO_TCP:
118                 fd = socket(AF_INET, SOCK_STREAM, 0);
119                 break;
120 #ifdef    IPV6
121             case IPPROTO_IPV6:
122                 fd = Socket(AF_INET6, SOCK_STREAM, 0);
123                 break;
124 #endif
125 #ifdef    IPPROTO_SCTP
126             case IPPROTO_SCTP:
127                 fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
128                 break;
129 #endif
130             default:
131                 printf("Can't create fd for level %d\n", ptr->opt_level);
132             }
133
134             len = sizeof(val);
135             if (getsockopt(fd, ptr->opt_level, ptr->opt_name, &val, &len) == -1) {
136                 printf("getsockopt error\n");
137             } else {
138                 printf("default = %s\n", (*ptr->opt_val_str)(&val, len));
139             }
140             close(fd);
141         }
142     }
143     exit(0);
144 }
145 /* end checkopts2 */
146
147 /* include checkopts3 */
148 static char    strres[128];
149
150 static char    *sock_str_flag(union val *ptr, int len)
151 {
152 /* *INDENT-OFF* */
153     if (len != sizeof(int))
154         snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
155     else
156         snprintf(strres, sizeof(strres),
157                  "%s", (ptr->i_val == 0) ? "off" : "on");
158     return(strres);
159 /* *INDENT-ON* */
160 }
161 /* end checkopts3 */
162
163 static char    *sock_str_int(union val *ptr, int len)
164 {
165     if (len != sizeof(int))
166         snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
167     else
168         snprintf(strres, sizeof(strres), "%d", ptr->i_val);
169     return(strres);
170 }
171
172 static char    *sock_str_linger(union val *ptr, int len)
173 {
174     struct linger    *lptr = &ptr->linger_val;
175
176     if (len != sizeof(struct linger))
177         snprintf(strres, sizeof(strres),
178                  "size (%d) not sizeof(struct linger)", len);
179     else
180         snprintf(strres, sizeof(strres), "l_onoff = %d, l_linger = %d",
181                  lptr->l_onoff, lptr->l_linger);
182     return(strres);
183 }
184
185 static char    *sock_str_timeval(union val *ptr, int len)
186 {
187     struct timeval    *tvptr = &ptr->timeval_val;
188
189     if (len != sizeof(struct timeval))
190         snprintf(strres, sizeof(strres),
191                  "size (%d) not sizeof(struct timeval)", len);
192     else
193         snprintf(strres, sizeof(strres), "%d sec, %d usec", (int )tvptr->tv_sec, (int )tvptr->tv_usec);
194     return(strres);
195 }

运行结果

SO_BROADCAST: default = off
SO_DEBUG: default = off
SO_DONTROUTE: default = off
SO_ERROR: default = 0
SO_KEEPALIVE: default = off
SO_LINGER: default = l_onoff = 0, l_linger = 0
SO_OOBINLINE: default = off
SO_RCVBUF: default = 87380       //接受缓冲区大小
SO_SNDBUF: default = 16384       //发送缓冲区大小
SO_RCVLOWAT: default = 1
SO_SNDLOWAT: default = 1
SO_RCVTIMEO: default = 0 sec, 0 usec
SO_SNDTIMEO: default = 0 sec, 0 usec
SO_REUSEADDR: default = off
SO_REUSEPORT: default = off
SO_TYPE: default = 1          //套接字类型
IP_TOS: default = 0
IP_TTL: default = 64          //存活时间
IPV6_DONTFRAG: (undefined)
IPV6_UNICAST_HOPS: Can't create fd for level 41
getsockopt error
IPV6_V6ONLY: Can't create fd for level 41
getsockopt error
TCP_MAXSEG: default = 536
TCP_NODELAY: default = off
SCTP_AUTOCLOSE: (undefined)
SCTP_MAXBURST: (undefined)
SCTP_MAXSEG: (undefined)
SCTP_NODELAY: (undefined)

转载于:https://www.cnblogs.com/ruo-yu/p/5013765.html

008 查看套接字选项是否受支持(获取当前环境下套接字选项默认值)相关推荐

  1. java的下拉框的设置默认值,html下拉选项属性 html下拉框怎么设置默认值?

    html下拉框怎么设置默认值 设置selected属性就可以,具体的用法,首先打开hbuilder软件,新建一个html文档,里面写入一个select下拉框: 然后给select中一个option设置 ...

  2. 远程可视化控制ubuntu桌面;ubuntu安装搜狗输入法;google浏览器代理访问不了系统不受支持问题解决

    1.远程可视化控制ubuntu桌面 远程ubuntu系统会因为不同桌面导致链接黑屏或灰屏:如果ubuntu系统是自带的GDM(gnome)做梦系统,那就灰远程连接不能可视化 参考:https://ww ...

  3. 【转载】Linux下套接字学习

    感觉这个系列还不错,学习一下. 先看的是第三篇: http://blog.csdn.net/gatieme/article/details/46334337 < Linux下套接字详解(三)-- ...

  4. Linux下套接字详解(二)----套接字Socket

    在前面我们讲了TCP/IP.TCP和UDP的一些基本知识,但是协议只有一套,而我们系统多个TCP连接或多个应用程序进程必须通过同一个 TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算 ...

  5. 企业微信的微文档 如何做二级联动,当前item的下拉框选项,受前一个item的内容限制...

    企业微信的微文档可以通过脚本来实现二级联动.首先需要在表单中添加两个下拉框,一个用来作为前一个item,另一个用来作为后一个item.然后在表单的脚本中,对前一个item的选择进行监听,根据前一个it ...

  6. Linux史上最全(30000字)知识点总结,含部署环境搭建步骤(建议收藏后看)

    认识Linux 入门概述 我们为什么要学习Linux linux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板.就如同在国内再搞一 ...

  7. linux 查看mysql安装目录_Linux环境下安装MySQL数据库示例教程

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 Linux环境对大多数SQL初学者还是比较陌生,今天给大家演示一下如何在Linux环境 ...

  8. unc 目录不受支持_Shopify平台对于店铺模版都提供哪些支持

    在自定义Shopify模版之前,请确保您了解可用的支持级别.如果您要进行基本的自定义,则可以从模版开发人员处获取支持.如果您要对模版进行大量更改,请参阅我们的模版支持的其他资源列表. 若要了解 Sho ...

  9. matlab报错问题处理,函数或变量无法识别,不受支持的符号、不可见的字符或非 ASCII 字符的粘贴———卸载之前

    matlab报错问题处理,, 文本字符无效.请检查不受支持的符号.不可见的字符或非 ASCII 字符的粘贴. matlab里面缺少自带函数处理办法: 1.比较好的方法是重装. 2.也可以缺哪个文件,就 ...

最新文章

  1. 我的阿里梦——淘宝前端必备技能
  2. 如何面试.NET/ASP.NET工程师?
  3. springboot 返回json字符串格式化问题
  4. 华为交换机开机后接口等一直闪_交换机的工作原理
  5. 理解分布式和集群的区别
  6. Dell™ PowerEdge™ R710机架式服务器旨在成为虚拟化企业的构建块
  7. 利润表模板excel_分享用了8年的excel记账系统,一键录入,多表生成,记账很简单...
  8. 使用谷歌云盘和colab训练自己的数据集(yolov5格式)
  9. Java安装包(JDK)安装和运行环境配置【超全】
  10. 如何加载和保存AutoCAD DXF文件(四参数法)
  11. 小米路由器显示DNS服务器设置错误,小米路由器dns异常怎么修复
  12. 谁在用生命为错误买单?
  13. 吴恩达亲述:如何高效阅读论文,开启一个新的领域!
  14. 黑马培训学编程python
  15. python中的分支结构——if语句
  16. gpu服务器厂家_嵌入式主板厂家告诉你选择GPU服务器的5大标准
  17. IDEA界面太丑了 我教你修改界面吧
  18. 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》
  19. 您的环境不支持excel引出功能_office插件Excel工具箱15.54下载安装教程
  20. c语言中英翻译及程序设计,c语言编程英语词汇带翻译

热门文章

  1. Github图片无法打开的问题解决【2020.07.20更新】
  2. jq使用教程01_最贴心教程,安装JQData全靠这篇指南
  3. 嵌入式工程师有发展前途吗?这是我看过最靠谱的回答
  4. 从0-1教你大屏制作!实时数据处理+零代码,它的可视化堪比python
  5. Java连接程序数据源
  6. vue页面按钮点击后,呈现loading加载状态
  7. 利用Python Matplotlib库做简单的视觉化(2)
  8. vue搭配animate4版本失效
  9. linux与linux传文件乱码,关于Linux与windows传递文件乱码问题
  10. 【caffe】ubuntu配置matlab接口----matcaffe