前言
在网络套接字编程中,我们可以通过设置套接字选项让网络协议按照我们预想的方式工作。本文教你如何获取当前的套接字选项,以及如何设置套接字选项。
涉及函数
以下两个函数包含在头文件 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. 各类套接字含义请参阅相关教材,篇幅有限不做介绍。