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


    前言

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

    涉及函数

           以下两个函数包含在头文件 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. 各类套接字含义请参阅相关教材,篇幅有限不做介绍。

  • 相关阅读:
    略少面试题 项目中用到的技术详解 有用
    python在VM+centos7 下面的安装
    shell基础09 归档数据
    shell基础10 sed,gawk和shell的对比
    shell练习03 mysql在脚本中的使用
    shell练习03 安装mysql
    shell基础09 gawk程序(上)
    shell练习02 归档数据文件
    shell基础08 sed命令行编辑器(上)
    shell基础07 函数
  • 原文地址:https://www.cnblogs.com/muchen/p/6877587.html
Copyright © 2020-2023  润新知