千家信息网

linux下setsockopt和getsockopt函数是什么

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,linux下setsockopt和getsockopt函数是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。功能描述:获取或者设置与某
千家信息网最后更新 2025年11月08日linux下setsockopt和getsockopt函数是什么

linux下setsockopt和getsockopt函数是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

 功能描述:

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

用法:

#include

#include

int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);

  参数:

  sock:将要被设置或者获取选项的套接字。

  level:选项所在的协议层。

  optname:需要访问的选项名。

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

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

  返回说明:

  成功执行时,返回0。失败返回-1,errno被设为以下的某个值

  EBADF:sock不是有效的文件描述词

  EFAULT:optval指向的内存并非有效的进程空间

  EINVAL:在调用setsockopt()时,optlen无效

  ENOPROTOOPT:指定的协议层不能识别选项

  ENOTSOCK:sock描述的不是套接字

  参数详细说明:

  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_OPTINOSIP首部选项int

  IP_TOS服务类型

  IP_TTL生存时间int

  ========================================================================

  IPPRO_TCP

  ------------------------------------------------------------------------

  TCP_MAXSEGTCP最大数据段的大小 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与对方互换得到的。对于客户,O_RCVBUF选项必须在connect之前设置;对于服务器,SO_RCVBUF选项必须在listen前设置。

  结合原理说明:

  1.每个套接口都有一个发送缓冲区和一个接收缓冲区。 接收缓冲区被TCP和UDP用来将接收到的数据一直保存到由应用进程来读。 TCP:TCP通告另一端的窗口大小。 TCP套接口接收缓冲区不可能溢出,因为对方不允许发出超过所通告窗口大小的数据。这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接 收方TCP将丢弃它。 UDP:当接收到的数据报装不进套接口接收缓冲区时,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报。

  2.我们经常听说tcp协议的三次握手,但三次握手到底是什么,其细节是什么,为什么要这么做呢?

  第一次:客户端发送连接请求给服务器,服务器接收;

  第二次:服务器返回给客户端一个确认码,附带一个从服务器到客户端的连接请求,客户机接收,确认客户端到服务器的连接.

  第三次:客户机返回服务器上次发送请求的确认码,服务器接收,确认服务器到客户端的连接.

  我们可以看到:

  1. tcp的每个连接都需要确认.

  2. 客户端到服务器和服务器到客户端的连接是独立的.

  我们再想想tcp协议的特点:连接的,可靠的,全双工的,实际上tcp的三次握手正是为了保证这些特性的实现.

  3.setsockopt的用法

  1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:

  BOOL bReuseaddr=TRUE;

  setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));

  2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:

  BOOL bDontLinger = FALSE;

  setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));

  3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:

  int nNetTimeout=1000;//1秒

  //发送时限

  setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));

  //接收时限

  setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

  4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节

  (异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据

  和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:

  // 接收缓冲区

  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));

  5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响

  程序的性能:

  int nZero=0;

  setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));

  6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):

  int nZero=0;

  setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));

  7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:

  BOOL bBroadcast=TRUE;

  setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));

  8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)

  BOOL bConditionalAccept=TRUE;

  setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));

  9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?

  struct linger {

  u_short l_onoff;

  u_short l_linger;

  };

  linger m_sLinger;

  m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)

  // 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;

  m_sLinger.l_linger=5;//(容许逗留的时间为5秒)

  setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));

看完上述内容,你们掌握linux下setsockopt和getsockopt函数是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

缓冲 数据 缓冲区 服务 套接字 服务器 客户 大小 过程 函数 控制 有效 参数 名称 实际 客户端 指向 端的 类型 系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 阿米巴软件开发部门 彤悦网络技术 查询数据库中科学计数法字段 sql数据库日志清理工具 个人搭配一个视频服务器腾讯云 学校如何预防网络安全图片 政法工作重点人群建立数据库 针对煤矿的网络安全防护 中央频道教育与网络安全 浏阳市软件开发培训 龙之谷提示服务器未就绪 联想t280服务器红灯闪烁 网络安全体系五位一体 泉州五金备件管理软件开发 我知道的网络安全防护小技巧有 怎么做企业内网网络安全 脑出血 公开数据库 日常网络安全题目 网络安全文明知识竞赛 软件开发成功案例及其原因分析 实况无线网络安全 3 股市软件开发指数 办公pc可以装服务器系统吗 hero引擎服务器里打不开 魔兽世界怀旧服投诉服务器 数据库中的客户与厂家的关系图 北京五二七网络技术公司 企业软件开发规范文档 网易云音乐云盘上传服务器错误 网络安全和安全工程哪个好
0