setsockopt和getsockopt参数说明和使用

说明:setsockopt和getsockopt用于设置和获取通信栈上所有层上的选项;
头文件:

#include 
#include 

函数原型:

int setsockopt(int s,   int level,   int optname,   void *optval,   int optlen);
int getsockopt(int s,   int level,   int optname,   void *optval,   int optlen);

参数说明:
s 表示socket描述符;
level 可能的取值如下式
setsockopt和getsockopt参数说明和使用_第1张图片
optname和optval的类型与level的取值有关;

(1).当level的值为SOL_SOCKET时,上面两个值得取值列表如下所示:
setsockopt和getsockopt参数说明和使用_第2张图片
(2).当level的值为IPPROTO_IP时,optname和optval的取值如下
setsockopt和getsockopt参数说明和使用_第3张图片
optlen
optval数据的大小

例如1:获取连接中TTL值,TOS值;

int ip_ttl = -1;
int ip_tos = -1;
socklen_t ttl_len = sizeof(ip_ttl);
socklen_t tos_len = sizeof(ip_tos);

getsockopt(cfd, IPPROTO_IP, IP_TTL, &ip_ttl, &ttl_len);
getsockopt(cfd, IPPROTO_IP, IP_TOS, &ip_tos, &tos_len);

printf("ttl : %d;   tos: %d\n", ip_ttl, ip_tos);

例如2:使插口层能被重用

int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

例如3:connect连接超时限定机制

struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
socklen_t len = sizeof(timeout);

int nResult = setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, len);
if(nResult < 0) printf("fault\n");

你可能感兴趣的:(TCP-IP小结)