• 第四天网络编程笔记


    【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-- 等待接收数据

  • 相关阅读:
    poj 3278 catch that cow
    POJ 1028 Web Navigation
    poj 2643 election
    hdu 1908 double queues
    hdu_2669 Romantic(扩展欧几里得)
    0/1背包 dp学习~6
    校验码
    最长上升子序列(LIS经典变型) dp学习~5
    LCS最长公共子序列~dp学习~4
    最长上升子序列(LIS) dp学习~3
  • 原文地址:https://www.cnblogs.com/renchong/p/5628861.html
Copyright © 2020-2023  润新知