008 查看套接字选项是否受支持(获取当前环境下套接字选项默认值)
代码来源:《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 查看套接字选项是否受支持(获取当前环境下套接字选项默认值)相关推荐
- java的下拉框的设置默认值,html下拉选项属性 html下拉框怎么设置默认值?
html下拉框怎么设置默认值 设置selected属性就可以,具体的用法,首先打开hbuilder软件,新建一个html文档,里面写入一个select下拉框: 然后给select中一个option设置 ...
- 远程可视化控制ubuntu桌面;ubuntu安装搜狗输入法;google浏览器代理访问不了系统不受支持问题解决
1.远程可视化控制ubuntu桌面 远程ubuntu系统会因为不同桌面导致链接黑屏或灰屏:如果ubuntu系统是自带的GDM(gnome)做梦系统,那就灰远程连接不能可视化 参考:https://ww ...
- 【转载】Linux下套接字学习
感觉这个系列还不错,学习一下. 先看的是第三篇: http://blog.csdn.net/gatieme/article/details/46334337 < Linux下套接字详解(三)-- ...
- Linux下套接字详解(二)----套接字Socket
在前面我们讲了TCP/IP.TCP和UDP的一些基本知识,但是协议只有一套,而我们系统多个TCP连接或多个应用程序进程必须通过同一个 TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算 ...
- 企业微信的微文档 如何做二级联动,当前item的下拉框选项,受前一个item的内容限制...
企业微信的微文档可以通过脚本来实现二级联动.首先需要在表单中添加两个下拉框,一个用来作为前一个item,另一个用来作为后一个item.然后在表单的脚本中,对前一个item的选择进行监听,根据前一个it ...
- Linux史上最全(30000字)知识点总结,含部署环境搭建步骤(建议收藏后看)
认识Linux 入门概述 我们为什么要学习Linux linux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板.就如同在国内再搞一 ...
- linux 查看mysql安装目录_Linux环境下安装MySQL数据库示例教程
点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 Linux环境对大多数SQL初学者还是比较陌生,今天给大家演示一下如何在Linux环境 ...
- unc 目录不受支持_Shopify平台对于店铺模版都提供哪些支持
在自定义Shopify模版之前,请确保您了解可用的支持级别.如果您要进行基本的自定义,则可以从模版开发人员处获取支持.如果您要对模版进行大量更改,请参阅我们的模版支持的其他资源列表. 若要了解 Sho ...
- matlab报错问题处理,函数或变量无法识别,不受支持的符号、不可见的字符或非 ASCII 字符的粘贴———卸载之前
matlab报错问题处理,, 文本字符无效.请检查不受支持的符号.不可见的字符或非 ASCII 字符的粘贴. matlab里面缺少自带函数处理办法: 1.比较好的方法是重装. 2.也可以缺哪个文件,就 ...
最新文章
- 我的阿里梦——淘宝前端必备技能
- 如何面试.NET/ASP.NET工程师?
- springboot 返回json字符串格式化问题
- 华为交换机开机后接口等一直闪_交换机的工作原理
- 理解分布式和集群的区别
- Dell™ PowerEdge™ R710机架式服务器旨在成为虚拟化企业的构建块
- 利润表模板excel_分享用了8年的excel记账系统,一键录入,多表生成,记账很简单...
- 使用谷歌云盘和colab训练自己的数据集(yolov5格式)
- Java安装包(JDK)安装和运行环境配置【超全】
- 如何加载和保存AutoCAD DXF文件(四参数法)
- 小米路由器显示DNS服务器设置错误,小米路由器dns异常怎么修复
- 谁在用生命为错误买单?
- 吴恩达亲述:如何高效阅读论文,开启一个新的领域!
- 黑马培训学编程python
- python中的分支结构——if语句
- gpu服务器厂家_嵌入式主板厂家告诉你选择GPU服务器的5大标准
- IDEA界面太丑了 我教你修改界面吧
- 智能驾驶 车牌检测和识别(一)《CCPD车牌数据集》
- 您的环境不支持excel引出功能_office插件Excel工具箱15.54下载安装教程
- c语言中英翻译及程序设计,c语言编程英语词汇带翻译
热门文章
- Github图片无法打开的问题解决【2020.07.20更新】
- jq使用教程01_最贴心教程,安装JQData全靠这篇指南
- 嵌入式工程师有发展前途吗?这是我看过最靠谱的回答
- 从0-1教你大屏制作!实时数据处理+零代码,它的可视化堪比python
- Java连接程序数据源
- vue页面按钮点击后,呈现loading加载状态
- 利用Python Matplotlib库做简单的视觉化(2)
- vue搭配animate4版本失效
- linux与linux传文件乱码,关于Linux与windows传递文件乱码问题
- 【caffe】ubuntu配置matlab接口----matcaffe