经历

有次偶然的机会,想通过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有时偶然返回为零的异常相关推荐

  1. main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。

    main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出. 参考文章: (1)main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出. (2)https://www.cnbl ...

  2. java中飞飞检查异常_Springboot项目如何在controller层统一返回数据以及处理异常

    在开发项目中,对于controller返回数据同时返回可能大家都能够做到.也就是定义一个相应类,里面有code, msg,content(或data). 在此基础上可能还会再封装以下,搞个基础cont ...

  3. java 异常返回json_Spring MVC全局异常后返回JSON异常数据

    问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...

  4. 检索方法应该返回#39;null#39;还是无法产生返回值时引发异常? [关闭]

    已关闭 . 这个问题是 基于观点的 . 它当前不接受答案. 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答. 3年前关闭. 我有一种方法,应该在找到对象后返回它. 如果找不到, ...

  5. 8.编写一个除法计算器,程序具有try-catch-finally结构,程序要求用户输入除数和被除数,在出现除数为零(异常2)和除数、被除数中有一个不是数字(异常1)的情况时进行相应的处理。当调用存放

    8.编写一个除法计算器,程序具有try-catch-finally结构,程序要求用户输入除数和被除数,在出现除数为零(异常2)和除数.被除数中有一个不是数字(异常1)的情况时进行相应的处理.当调用存放 ...

  6. 记:一次单板的意外串口异常解决(下)——PC端

    0x00前言 写下这篇文章主要目的是总结一下最近调试的一块单板遇到的,关于串口方面的一些问题.本文将会分为上下两篇,这篇为下篇,主要讲述的是: 串口接在PC端时出现意外的接收数据错误 阅读本文,您可能 ...

  7. python的常见矩阵除法_Numpy矩阵除法返回所有零

    我对下面的矩阵有个除法错误.我想用行和的10×1向量除以10×10matrix.在[[5731, 3, 20, 8, 12, 54, 46, 8, 39, 2], [ 2, 6472, 47, 24, ...

  8. PAT Java 返回非零 的原因 OJ

    原因是你写的代码里面的public class后面的那个名字不是Main,改成Main就可以通过了~ public class Main{ // 此处应为Mainpublic static void ...

  9. oracle返回0001错误,ORACLE 异常错误处理

    本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2 ...

最新文章

  1. Jquery JQZoom Plugin 放大鏡效果 Two
  2. 终身成长究竟有多重要?
  3. Python 参考手册
  4. 介绍一款facebook信息收集工具FBI
  5. RxJava2学习笔记(3)
  6. Spring Web 应用的最大败笔
  7. 拉勾启源老师mysql讲义,【拉勾教育数据分析实战训练营】--Tableau学习笔记-重点回顾1...
  8. python入门教程收藏_特别详细的Python入门教程,建议收藏
  9. OIDC在 ASP.NET Core中的应用
  10. 重点客户销售数据分析python_药品销售数据分析--python
  11. 【laravel】【转发】laravel 导入导出excel文档
  12. 2019文献汇总 | 单细胞与病毒感染
  13. 【分析模板】excel or sas
  14. 嘉兴市计算机技工学校,嘉兴市高级技工学校2021年招生简章
  15. 如何保护 IT 基础设施的安全?谷歌给出了500页的答案
  16. IP地址快速切换(转)
  17. SPSS在物流业中的应用
  18. 独孤求败-小滴云架构大课十八式-xdclass2022
  19. 如何在shell脚本中定义数组及遍历
  20. 【有奖转发】#大学生IT博客大赛#热情开幕!(人人活动)

热门文章

  1. java轮盘赌_轮盘赌算法
  2. VS下报LNK1104的一种解决方法
  3. Android自定义系列——13.Matrix Camera
  4. 输入一个字符串,逆序并输出
  5. Windows Service 创建与安装
  6. java多线程使用业务场景_Java多线程使用场景
  7. 物联网系统中常见的通信协议分析
  8. 从软件工程师到IT猎头:说说跳槽那点事
  9. Openstack 虚拟机云盘扩容
  10. 联想小新触控板不行了