函数原型:
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>
int
main(int argc, char **argv)
{
int sockfd, mss, sendbuff;
socklen_t optlen;
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
optlen = sizeof(mss);
Getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &optlen);
printf("TCP mss = %d\n", mss);
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
|