zoukankan      html  css  js  c++  java
  • 第四天网络编程笔记

    【1】网络套接字的属性
    getsockopt()/setsockopt() 获取/设置一个套接口选项

    int getsockopt(int sockfd, int level, int optname,
    void *optval, socklen_t *optlen);
    功能:获取网络套接字的属性
    参数:sockfd 网络套接字
    level SOL_SOCKET (应用层API LEVEL)
    IPPROTO_TCP (TCP 层)
    IPPROTO_IP (IP层)
    optname 操作的名字
    SO_DEBUG
    SO_BROADCAST 广播
    SO_REUSEADDR 重复绑定
    SO_SNDBUF 发送缓存区大小
    SO_RCVBUF 接收缓存区的大小

    optval 操作的值
    optlen 操作值的大小
    返回值:成功0,出错 -1

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

    功能:设置网络套接字的属性
    参数:sockfd 网络套接字
    level SOL_SOCKET (应用层API LEVEL)
    IPPROTO_TCP (TCP 层)
    IPPROTO_IP (IP层)
    optname 操作的名字
    SO_DEBUG
    SO_BROADCAST 广播
    SO_REUSEADDR 重复绑定
    SO_SNDBUF 发送缓存区大小
    SO_RCVBUF 接收缓存区的大小
    SO_RCVTIMEO 超时检测

    optval 操作的值
    optlen 操作值的大小
    返回值:成功0,出错 -1


    【2】网络的超时检测
    超时检测的必要性
    避免进程在没有数据时无限制地阻塞
    当设定的时间到时,进程从原操作返回继续运行

    1-- 使用setsockopt 修改套接字的属性,设置超时时间值

    struct timeval tv;
    tv.tv_sec = 5;
    tv.tv_usec = 0;

    if(setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
    {
    err_log("fail to setsockopt.");
    }

    一次设置终身有效。


    2-- 使用select 实现超时检测
    struct timeval tv;
    tv.tv_sec = 5;
    tv.tv_usec = 0;
    select(maxfd+1, &readfds, NULL, NULL, &tv)

    描述:select 阻塞等待文件描述符,准备就绪。如果在规定的时间内,
    没有文件描述符准备就绪,那么立刻返回,返回值为0
    如果在规定的时间内,有文件描述符准备就绪,那么也立刻返回
    返回值代表已经准备就绪的文件描述符的个数。
    并且将没有准备的就绪文件描述符,从集合中清除掉。

    注意:tv的值,在每次执行完select 之后,被清零了。


    3-- alarm 闹钟定时器
    int sigaction(int signum, const struct sigaction *act,
    struct sigaction *oldact);

    The sigaction structure is defined as something like:

    struct sigaction {
    void (*sa_handler)(int); // 信号处理函数
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags; // 信号属性标记位,SA_RESTART (系统调用自重启属性)
    void (*sa_restorer)(void);
    };

    系统调用自重启属性:默认信号函数处理完毕之后,会回到原来的程序被打断的地方重新执行。


    读--改---写

    struct sigaction act;

    sigaction(SIGALRM, NULL, &act);
    act.sa_handler = handler;
    act.sa_flags &= ~SA_RESTART;
    sigaction(SIGALRM, &act, NULL);

    66 alarm(5);


    【3】广播
    前面介绍的数据包发送方式只有一个接受方,称为单播
    如果同时发给局域网中的所有主机,称为广播

    只有用户数据报(使用UDP协议)套接字才能广播

    广播地址
    以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址
    发到该地址的数据包被所有的主机接收
    255.255.255.255在所有网段中都代表广播地址

    广播发送者流程:

    1-- 创建用户数据报套接字

    2-- 缺省创建的套接字不允许广播数据包,需要设置属性
    setsockopt可以设置套接字属性

    3-- 填充网络信息结构体(广播地址和端口)

    4--发送数据包

    广播接收者流程:
    1-- 创建用户数据报套接字

    2-- 绑定广播的IP地址和端口
    绑定的端口必须和发送方指定的端口相同

    3-- 等待接收数据

  • 相关阅读:
    VIJOS P1057盖房子 (动态规划)
    RQNOJ PID57 / 找啊找啊找GF
    RQNOJ PID302 / [NOIP2001]统计单词个数 (动态规划)
    hdu 3829 Cat VS Dog 最大独立集
    并查集 找k颗树使节点数最多
    在 Sublime Text 3 中配置编译和运行 Java 程序
    在 Sublime Text 3 中配置编译和运行 Java 程序
    StarUML license key
    StarUML license key
    测试对于list的sort与sorted的效率
  • 原文地址:https://www.cnblogs.com/renchong/p/5628861.html
Copyright © 2011-2022 走看看