setsockopt()函数详解
作者:互联网
函数原型:
int setsockopt(int sockfd , int level, int optname, void *optval, socklen_t *optlen);
函数功能:设置套接字描述符的属性。
参数:
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));
层次level使用的是通用套接字代码(SOL_SOCKET)
选项名optname是SO_SNDBUF,用来设置发送缓冲区大小,不同选项设置的内容不同。
optval是自己设置的一个值。
optlen是该值的数据长度
还有一些常用的用法,可以参考百度百科的应用举例:https://baike.baidu.com/item/setsockopt/10069288?fr=aladdin
标签:setsockopt,函数,sendbuff,int,level,TCP,详解,SO,optlen 来源: https://blog.csdn.net/qq_41960161/article/details/122705626