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

上一篇:PAT Basic Level-1018 锤子剪刀布


下一篇:【PAT (Basic Level) Practice】——【简单数学】1019 数字黑洞