• 网络IPC:套接字之套接字选项


    套接字机制提供两个套接字选项接口来控制套接字的行为。一个接口用来设置选项,另一个接口允许查询一个选项的状态。可以获取或设置的三种选项:

    (1)通用选项,工作在所有套接字类型上。

    (2)在套接字层次管理的选项,但是依赖于下层协议的支持。

    (3)特定与某协议的选项,为每个协议所独有。

    Single UNIX Specification仅定义了套接字层的选项(上述三种选项中的前两种选项)。

    可以采用setsockopt函数来设置套接字选项。

    #include <sys/socket.h>
    int setsockopt(int sockfd, int level, in option, const void *val, socklen_t len);
    返回值:若成功则返回0,出错则返回-1

    参数level标识了选项(option)应用的协议。如果选项(option)是通用的套接字层选项,level设置成SOL_SOCKET。否则,level设置成控制这个选项的协议号。例如,对于TCP选项,这是IPPROTO_TCP,对于IP选项,这是IPPROTO_IP。表16-10总结了Single UNIX Specification所定义的通用套接字层的选项。

                                                                            表16-10 套接字选项

    未命名

    参数val根据选项(option)的不同指向一个数据结构或一个整数。一些选项是on/off开关。如果整数非零,那么选项(option)被启用。如果整数为零,那么选项(option)被禁止。参数len指定了val指向的对象的大小。

    可以使用getsockopt函数来发现选项的当前值。

    #include <sys/socket.h>
    int getsockopt(int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp);
    返回值:若成功则返回0,出错则返回-1

    注意参数lenp是一个指向整数的指针。在调用getsockopt之前,设置该整数为复制选项缓冲区的大小。如果实际的尺寸大于此值,选项会被截断而不报错;如果实际尺寸正好等于或者小于此值,那么返回时将此值更新为实际尺寸。

    实例

    当服务器终止并尝试立即重启时,程序清单16-3中的函数不会正常工作。除非超时(这通常约为几分钟),通常TCP的实现不允许绑定同一个地址。幸运的是套接字选项SO_REUSEADDR允许越过这个限制,如程序清单16-9所示。

    #include "apue.h"
    #include <errno.h>
    #include <sys/socket.h>
    
    int initserver(int type, const struct sockaddr *addr, socklen_t alen, int qlen)
    {
        int fd, err;
        int reuse = 1;
    
        if((fd = socket(addr->sa_family, type, 0)) < 0)
            return(-1);
        if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int)) < 0)
        {
            err = errno;
            goto errout;
        }
        if(bind(fd, addr, alen) < 0)
        {
            err = errno;
            goto errout;
        }
        if(type == SOCK_STREAM || type == SOCK_SEQPACKET)
        {
            if(listen(fd, qlen) < 0)
            {
                err = errno;
                goto errout;
            }
        }
        return(fd);
    
    errout:
        close(fd);
        errno = err;
        return(-1);
    }

    为了启用SO_REUSEADDR选项,在setsockopt中val的参数设置为一个非零整数的地址。设置len参数为val所指的对象的大小。

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    第一阶段冲刺第三天
    C语言printf函数求值顺序
    计算文件的MD5值
    SWFUpload后台取数据
    swfupload的使用方式
    文件上传的几种方式
    自定义缓存
    发邮件
    生成验证码
    将序列化成json格式后日期(毫秒数)转成日期格式
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3567593.html
Copyright © 2020-2023  润新知