记getsockopt有时偶然返回为零的异常
经历
有次偶然的机会,想通过setsockopt
接口设置socket的收发缓冲区大小,但是在设置后调用getsockopt
验证下设定后的大小,getsockopt
竟然返回大小为零,确实让自己疑惑不已!
后来短暂休息、呼吸了几下,突然想通,原来是因为getsockopt
接口中的optlen参数必须为in & out参数:在调用前需要设置optval的大小为sizeof(optval)
,在函数返回后,optval携带真实的选项大小。
如果不在getsockopt
调用前设置optlen参数大小,则在某些环境中运行时,例如,CentOS7,会得到返回值为零的情况!
延展
通过setsockopt
设定套接字缓冲区的大小,在Linux环境中还会受到内核参数的限制。如果设定比较大的缓冲区大小,且超过了内核*max
参数的限制,则必须事先修改内核参数的值
socket收缓冲区内核参数
- net.core.rmem_max
- net.core.rmem_default
socket发缓冲区内核参数
- net.core.wmem_max
- net.core.wmem_default
显示和修改例子,其它可类比
sysctl net.core.rmem_max
sysctl -w net.core.rmem_max=$((102410241024))
代码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>int main(void)
{char szErrno[256];printf("\nHello World!");int tSock = socket(PF_INET, SOCK_DGRAM, 0);if(tSock < 0){strerror_r(errno, szErrno, sizeof(szErrno));printf("\ncreate sock errno: %d -> %s", errno, szErrno);return -1;}printf("\ncreate sock successfully, got sock fd: %d", tSock);struct sockaddr_in tSockAddr = {};tSockAddr.sin_family = AF_INET;//tSockAddr.sin_addr.s_addr = 0;tSockAddr.sin_port = htons(12701);int rc = bind(tSock, (struct sockaddr*)&tSockAddr, sizeof(tSockAddr));if(rc < 0){strerror_r(errno, szErrno, sizeof(szErrno));printf("\nbind errno: %d -> %s", errno, szErrno);return -1;}printf("\nbind successfully !");unsigned int bufSize = 1024*1024*1024;rc = setsockopt(tSock, SOL_SOCKET, SO_RCVBUF, (const void*)&bufSize, sizeof(bufSize));printf("\nsetsockopt rc: %d", rc);unsigned int optval = 0;/*optlen must be as in & out parameter*/socklen_t optlen;rc = getsockopt(tSock, SOL_SOCKET, SO_RCVBUF, (void*)&optval, &optlen);printf("\ngetsockopt without providing the optlen value. rc: %d, has set bufsize: %u, optlen: %u", rc, optval, optlen);//compare at CentOS7 envoptlen = sizeof(optval);rc = getsockopt(tSock, SOL_SOCKET, SO_RCVBUF, (void*)&optval, &optlen);printf("\ncompare getsockopt rc: %d, has set bufsize: %u, optlen: %u", rc, optval, optlen);printf("\n");close(tSock);return 0;
}
记getsockopt有时偶然返回为零的异常相关推荐
- main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。
main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出. 参考文章: (1)main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出. (2)https://www.cnbl ...
- java中飞飞检查异常_Springboot项目如何在controller层统一返回数据以及处理异常
在开发项目中,对于controller返回数据同时返回可能大家都能够做到.也就是定义一个相应类,里面有code, msg,content(或data). 在此基础上可能还会再封装以下,搞个基础cont ...
- java 异常返回json_Spring MVC全局异常后返回JSON异常数据
问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...
- 检索方法应该返回#39;null#39;还是无法产生返回值时引发异常? [关闭]
已关闭 . 这个问题是 基于观点的 . 它当前不接受答案. 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答. 3年前关闭. 我有一种方法,应该在找到对象后返回它. 如果找不到, ...
- 8.编写一个除法计算器,程序具有try-catch-finally结构,程序要求用户输入除数和被除数,在出现除数为零(异常2)和除数、被除数中有一个不是数字(异常1)的情况时进行相应的处理。当调用存放
8.编写一个除法计算器,程序具有try-catch-finally结构,程序要求用户输入除数和被除数,在出现除数为零(异常2)和除数.被除数中有一个不是数字(异常1)的情况时进行相应的处理.当调用存放 ...
- 记:一次单板的意外串口异常解决(下)——PC端
0x00前言 写下这篇文章主要目的是总结一下最近调试的一块单板遇到的,关于串口方面的一些问题.本文将会分为上下两篇,这篇为下篇,主要讲述的是: 串口接在PC端时出现意外的接收数据错误 阅读本文,您可能 ...
- python的常见矩阵除法_Numpy矩阵除法返回所有零
我对下面的矩阵有个除法错误.我想用行和的10×1向量除以10×10matrix.在[[5731, 3, 20, 8, 12, 54, 46, 8, 39, 2], [ 2, 6472, 47, 24, ...
- PAT Java 返回非零 的原因 OJ
原因是你写的代码里面的public class后面的那个名字不是Main,改成Main就可以通过了~ public class Main{ // 此处应为Mainpublic static void ...
- oracle返回0001错误,ORACLE 异常错误处理
本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2 ...
最新文章
- Jquery JQZoom Plugin 放大鏡效果 Two
- 终身成长究竟有多重要?
- Python 参考手册
- 介绍一款facebook信息收集工具FBI
- RxJava2学习笔记(3)
- Spring Web 应用的最大败笔
- 拉勾启源老师mysql讲义,【拉勾教育数据分析实战训练营】--Tableau学习笔记-重点回顾1...
- python入门教程收藏_特别详细的Python入门教程,建议收藏
- OIDC在 ASP.NET Core中的应用
- 重点客户销售数据分析python_药品销售数据分析--python
- 【laravel】【转发】laravel 导入导出excel文档
- 2019文献汇总 | 单细胞与病毒感染
- 【分析模板】excel or sas
- 嘉兴市计算机技工学校,嘉兴市高级技工学校2021年招生简章
- 如何保护 IT 基础设施的安全?谷歌给出了500页的答案
- IP地址快速切换(转)
- SPSS在物流业中的应用
- 独孤求败-小滴云架构大课十八式-xdclass2022
- 如何在shell脚本中定义数组及遍历
- 【有奖转发】#大学生IT博客大赛#热情开幕!(人人活动)