udhcp源码剖析(六)——DHCP客户端的superloop

在client中,通过一个无限的for循环进入super loop,super loop中代码流程也和服务器的类似,先是建立socket监听,然后通过select+ FD_SET设置,同时对socket和pipe信号进行超时监听,随后根据state对接收到的packet进行处理和响应。

3.3.1 建立socket和pipe,并进行监听

初始化超时时间和rfds根据listen_mode开启socket监听设置rfds绑定socket fd和signal_pipe[0]select超时等待rfds下注册信号的发生。

tv.tv_sec = timeout - monotonic_sec();
jump_in:
    tv.tv_usec = 0;
    if (listen_mode != LISTEN_NONE && sockfd < 0) {
        if (listen_mode == LISTEN_KERNEL)
            sockfd = listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
        else
            sockfd = raw_socket(client_config.ifindex);
    }
    max_fd = udhcp_sp_fd_set(&rfds, sockfd);

    retval = 0; /* If we already timed out, fall through, else... */
    if (tv.tv_sec > 0) {
        DEBUG("Waiting on select...");
        retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
    }

    now = monotonic_sec();
    if (retval < 0) {
        /* EINTR? signal was caught, don't panic */
        if (errno != EINTR) {
            /* Else: an error occured, panic! */
            bb_perror_msg_and_die("select");
        }
    } else if (retval == 0) {
  

retval是select函数的返回值,表示在定时tv时间内,信号集合rfds下注册fd中收到接收信号量的fd的个数,若retval为0,则表示在定时时间内没有fd收到接收信号量。或者,tv.tv_sec不大于0,即time_out<=time(0),已经超时,则也设置retval为0.

3.3.2 超时未收到信号

如果retval=0,则表示在定时期限内,没有收到socket和signal信号,则根据DHCP协议中对客户端行为的定义,依据状态执行操作。

/* timeout dropped to zero */
    switch (state) {
    case INIT_SELECTING:
        if (packet_num < client_config.retries) {
            if (packet_num == 0)
                xid = random_xid();

            /* send discover packet */
            send_discover(xid, requested_ip); /* broadcast */

            timeout = now + client_config.timeout;
            packet_num++;
        } else {
            udhcp_run_script(NULL, "leasefail");
            
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值