第二十一篇:启用/查看套接字选项的方法

前言

       在网络套接字编程中,我们可以通过设置套接字选项让网络协议按照我们预想的方式工作。本文教你如何获取当前的套接字选项,以及如何设置套接字选项。

涉及函数

       以下两个函数包含在头文件 sys/socket.h 中

1. int getsockopt ( int sockfd, int level, int optname, void * optval, socklen_t * optlen )

函数功能:获取 level 类型的套接字 sockfd 的套接字选项 optname ,并将结果存放进指针 optval 所指向的空间中,该结果空间大小为 optlen。

2. int setsockopt ( int sockfd, int level, int optname, const void * optval, socklen_t optlen )

函数功能:将 level 类型的套接字 sockfd 的套接字选项 optname 设置为指针 optval 所指向的空间中的值,optval的空间大小为optlen。

代码实现

       下面的代码打开SO_KEEPALIVE套接字选项,然后查询设置后的结果:

 1 #include    "unp.h"
 2 #include    <netinet/tcp.h>    
 3 
 4 int
 5 main(int argc, char **argv)
 6 {
 7     // fd为套接字描述符变量
 8     int fd;
 9     // val存放套接字选项值
10     int val;
11     // len存放val长度
12     socklen_t len;
13 
14     // 新建一个测试套接字( SOL_SOCKET类型也即通用套接字类型 )
15     fd = Socket(AF_INET, SOCK_STREAM, 0);
16 
17     // 获取套接字选项并存放入val
18     if ( getsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, &len) < 0 ) {
19             err_ret("getsockopt error");
20     }
21     else {
22         // 当val返回1表示选项已打开
23         if (val == 1) 
24             puts("SO_KEEPALIVE选项已经打开");
25         else {
26         // 当val返回0表示选项没有打开
27             puts("SO_KEEPALIVE选项没有打开");
28             
29             // 若选项没打开,我们打开选项。
30             val = 1;
31             len = sizeof(val);
32             if ( setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, len) < 0 ) {
33                 err_ret("getsockopt error");
34             }
35             // 好了,选项打开了。
36             if (val ==1) 
37                 puts("现在SO_KEEPALIVE选项已经打开");
38         }    
39 
40     }
41 
42     // 国际惯例 - 关闭套接字
43     close(fd);
44     exit(0);
45 }

运行测试

       

说明

1. SO_KEEPALIVE套接字选项的值是一个整数,因此val设置为int,别的套接字就未必了:可能是结构体。

2. 请留意那两个函数的参数类型是指针还是非指针。如果是指针,我们必须要选用指针所指对象的地址常量作为实参,否则报错。

3. 各类套接字含义请参阅相关教材,篇幅有限不做介绍。

原文地址:https://www.cnblogs.com/muchen/p/6877587.html