zoukankan      html  css  js  c++  java
  • 启用/查看套接字选项的方法

    前言

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

    涉及函数

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

      

  • 相关阅读:
    服务端TextBox焦点事件
    Ajax进度条动画制作网址
    ADSL错误代码大全
    ASP.NET MVC Framework体验(5):路径选择(URL Routing)(转)
    为表添加一列IsUpload默认值为0
    ASP.NET MVC Framework体验(3):表单提交(转)
    .NET开源项目
    Vista文件共享
    mysql的to_days函数
    Samba简介
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3343944.html
Copyright © 2011-2022 走看看