setsockopt()函数详解_setsockopt函数,程序员必须要了解的知识点

135 阅读2分钟

sockfd:要设置的套接字描述符。
level:选项定义的层次。或为特定协议的代码(如IPv4,IPv6,TCP,SCTP),或为通用套接字代码(SOL_SOCKET)。
optname:选项名。level对应的选项,一个level对应多个选项,不同选项对应不同功能。
optval:指向某个变量的指针,该变量是要设置新值的缓冲区。可以是一个结构体,也可以是普通变量
optlen:optval的长度。

关于optname的可选项,根据你需要的功能进行设置,下面是该参数的一些例举,来自unix网络编程。技术上的书是拿来查的,不是读,不然永远读不完。我们针对不同需求去查阅即可。

当level为SOL_SOCKET时,optname可以有以下选项(一部分)
SO_BROADCAST     允许发送广播数据            int
SO_DEBUG        允许调试                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

当level为IPPROTO_IP时,optname可以有以下选项(一部分)
IP_HDRINCL       在数据包中包含IP首部          int
IP_OPTINOS       IP首部选项               int
IP_TTL         生存时间                int

当level为IPPRO_TCP时,optname可以有以下选项(一部分)
TCP_MAXSEG       TCP最大数据段的大小          int
TCP_NODELAY       不使用Nagle算法             int

返回值:
成功时返回0,失败时返回-1。

例子:

#include "unp.h"
#include <netinet/tcp.h> /\* for TCP\_MAXSEG value \*/

int
main(int argc, char \*\*argv)
{
	int			sockfd, mss, sendbuff;
	socklen\_t	optlen;

	sockfd = Socket(AF_INET, SOCK_STREAM, 0);

		/\* Fetch and print the TCP maximum segment size. \*/
	optlen = sizeof(mss);
	Getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &optlen);
	printf("TCP mss = %d\n", mss);

		/\* Set the send buffer size, then fetch it and print its value. \*/
	sendbuff = 65536;
	Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff));

	optlen = sizeof(sendbuff);
	Getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);
	printf("send buffer size = %d\n", sendbuff);
	exit(0);
}

该例子中

Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff,sizeof(sendbuff));

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取