文档章节

getsockopt/setsockopt 函数说明

r
 ranjiewen
发布于 2016/11/03 23:52
字数 852
阅读 10
收藏 0

【 getsockopt/setsockopt系统调用】   
    
功能描述: 
获取或者设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须给出。例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP。


用法: 
int setsockopt(
  __in          SOCKET        s,
  __in          int                level,
  __in          int                optname,
  __in          const char* optval,
  __in          int               optlen
);

int getsockopt(
  __in          SOCKET   s,
  __in          int           level,
  __in          int           optname,
  __out        char*     optval,
  __in_out    int*       optlen
);

参数:   
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
optname:需要访问的选项名。


optval:对于getsockopt(),指向返回选项值的缓冲。

             对于setsockopt(),指向包含新选项值的缓冲。


optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。

              对于setsockopt(),The size, in bytes, of the optval buffer. 

 

level指定控制套接字的层次.可以取三种值: 
     1)SOL_SOCKET:通用套接字选项. 
     2)IPPROTO_IP:IP选项. 
     3)IPPROTO_TCP:TCP选项. 


optname指定控制的方式(选项的名称),我们下面详细解释 

optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 


选项名称        说明                  数据类型 
======================================================================== 
            SOL_SOCKET 
------------------------------------------------------------------------ 
SO_BROADCAST     允许发送广播数据            int 
SO_DEBUG          允许调试                int 
SO_DONTROUTE     不查找路由               int 
SO_ERROR        获得套接字错误             int 
SO_KEEPALIVE        保持连接                int 
SO_LINGER         延迟关闭连接              struct linger 
SO_OOBINLINE      带外数据放入正常数据流         int 
SO_RCVBUF         接收缓冲区大小             int 
SO_SNDBUF        发送缓冲区大小             int 
SO_RCVLOWAT       接收缓冲区下限             int 
SO_SNDLOWAT       发送缓冲区下限             int 
SO_RCVTIMEO       接收超时                struct timeval 
SO_SNDTIMEO       发送超时                struct timeval 
SO_REUSERADDR      允许重用本地地址和端口         int 
SO_TYPE              获得套接字类型             int 
SO_BSDCOMPAT      与BSD系统兼容              int 
========================================================================
            IPPROTO_IP 
------------------------------------------------------------------------
IP_HDRINCL       在数据包中包含IP首部          int 
IP_OPTINOS       IP首部选项               int 
IP_TOS           服务类型 
IP_TTL            生存时间                int 
========================================================================
            IPPRO_TCP 
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大数据段的大小           int 
TCP_NODELAY       不使用Nagle算法             int 
========================================================================

返回说明:   
成功执行时,返回0。失败返回-1,errno被设为以下的某个值   
EBADF:sock不是有效的文件描述词
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock描述的不是套接字

SO_RCVBUF和SO_SNDBUF每个套接口都有一个发送缓冲区和一个接收缓冲区,使用这两个套接口选项可以改变缺省缓冲区大小。

// 接收缓冲区
int nRecvBuf=32*1024;         //设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));


//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

注意:

当设置TCP套接口接收缓冲区的大小时,函数调用顺序是很重要的,因为TCP的窗口规模选项是在建立连接时用SYN与对方互换得到的。对于客户,SO_RCVBUF选项必须在connect之前设置;对于服务器,SO_RCVBUF选项必须在listen前设置。

 

本文转载自:http://www.cnblogs.com/ranjiewen/p/5716343.html

r
粉丝 1
博文 203
码字总数 28
作品 0
武汉
程序员
私信 提问
socket tcp缓冲区大小的默认值、最大值

1 设置socket tcp缓冲区大小的疑惑 疑惑1:通过setsockopt设置SOSNDBUF、SORCVBUF这连个默认缓冲区的值,再用getsockopt获取设置的值,发现返回值是设置值的两倍。为什么? 通过网上查找,看...

lichao19881026
2016/02/26
360
0
浅析:setsockopt()改善socket网络程序的健壮性

如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用 closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsocko...

消失了雨痕
2014/04/30
1K
0
linux蓝牙驱动代码阅读笔记

昨天看了一下介绍蓝牙协议文档,今天索性对照看了看kernel里的代码(bluez),这里记点笔记,还是继承了老毛病,只关注整体流程而忽略细节,先了解个大概,等真正需要时再仔细分析。 net/hci_...

天王盖地虎626
2018/12/28
4
0
Linux TCP/IP协议栈之Socket的实现分析(一 套接字的创建)

原文地址:http://blog.csdn.net/zyq2007/article/details/6576403 Socket并不是TCP/IP协议的一部份,从广义上来讲,socket是Unix/Linux抽像的进程间通讯的一种方法 网络socket通讯仅仅是其若干...

nothingfinal
2012/02/19
0
0
TCP 服务器端和客户端程序设计

1、设计思路 (1) socket函数: 为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。 第一个参数指明网络层协议簇,目前支持5种,最常用的有AFINET(IPv4...

吃一堑消化不良
2016/10/07
237
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部