Unix Network Programming Episode 105

复制代码
#include "web.h"

void start_connect(struct file *fptr)
{
    int fd, flags, n;
    struct addrinfo *ai;

    ai=Host_serv(fptr->f_host, SERV,0,SOCK_STREAM);
    fd=Socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
    fptr->f_fd=fd;

    printf("start_connect for %s, fd %d\n", fptr->f_name, fd);

    flags=Fcntl(fd, F_GETFL, 0);
    Fcntl(fd, F_SETFL, flags|O_NONBLOCK);

    if((n=connect(fd, ai->ai_addr, ai->ai_addrlen))<0)
    {
        if(errno!=EINPROGRESS)
            err_sys("nonblocking connect error");
        fptr->f_flags=F_CONNECTING;
        FD_SET(fd, &rset);
        FD_SET(fd, &wset);

        if(fd>maxfd)
            maxfd=fd;
    }
    else if(n>=0)
    {
        write_get_cmd(fptr);
    }
}

Initiate nonblocking connect

复制代码
#include "web.h"

void write_get_cmd(struct file *fptr)
{
    int n;
    char line[MAXLINE];

    n=snprintf(line, sizeof(line), GET_CMD, fptr->f_name);
    Writen(fptr->f_fd, line, n);
    printf("wrote %d bytes for %s\n", n, fptr->f_name);

    fptr->f_flags=F_READING;

    FD_SET(fptr->f_fd, &rset);
    if(fptr->f_fd>maxfd)
    {
        maxfd=fptr->f_fd;
    }
}

Send an HTTP GET command to the server

复制代码
    while(nlefttoread>0)
    {
        while(nconn<maxnconn&&nlefttoconn>0)
        {
            for(i=0;i<nfiles;i++)
            {
                if(file[i].f_flags==0)
                    break;
            }

            if(i==nfiles)
                err_quit("nlefttoconn=%d but nothing found", nlefttoconn);
            start_connect(&file[i]);
            nconn++;
            nlefttoconn--;
        }

        rs=rset;
        ws=wset;
        n=Select(maxfd+1, &rs, &ws, NULL,NULL);

        for(i=0;i<nfiles;i++)
        {
            flags=file[i].f_flags;
            if(flags==0||flags&F_DONE)
                continue;
            fd=file[i].f_fd;
            if(flags&F_CONNECTING&&
                (FD_ISSET(fd, &rs)||FD_ISSET(fd, &ws)))
                {
                    n=sizeof(error):
                    if(getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &n)<0 || error!=0)
                    {
                        err_ret("nonblocking connect failed for %s", file[i].f_name);
                    }
                    printf("connection established fro %s\n", file[i].f_name);
                    FD_CLR(fd, &wset);
                    write_get_cmd(&file[i]);
                }
                else if(flags& F_READING &&FD_ISSET(fd, &rs))
                {
                    if((n=Read(fd, buf, sizeof(buf)))==0)
                    {
                        printf("end-of-file on %s\n", file[i].f_name);
                        Close(fd);
                        file[i].f_flags=F_DONE;
                        FD_CLR(fd, &rset);
                        nconn--;
                        nlefttoread--;
                    }
                }
                else
                {
                    printf("read %d bytes from %s\n", n, file[i].f_name);
                }
        }
    }

    return 0;
}

Main loop of main function

相关推荐
木子欢儿9 小时前
Intel 架构的 MacBook Pro 运行 Linux 发热量高解决
linux·运维·服务器
清水迎朝阳12 小时前
客户端软件 — 用户统计方案
服务器·c++·客户端·用户统计
会编程的土豆12 小时前
Go 模板初识
linux·运维·服务器
腾讯蓝鲸智云13 小时前
标杆客户实践提炼:CFlow 版本价值流模板实战指南
运维·服务器·自动化·云计算·devops
阿标的博客13 小时前
Active Directory 组织单位和用户
服务器
Deryck_德瑞克14 小时前
【Nginx】配置差异分析
服务器·前端·nginx
前端 贾公子14 小时前
第06章:结构化输出 (上)
java·服务器·前端
regret~14 小时前
【记录】网络路由、转发与网卡隔离
linux·服务器·网络
一只小菜鸡..15 小时前
南京大学 操作系统 (JYY) 学习笔记:持久化的黑魔法——从磁铁、刻坑到闪存电荷
服务器·笔记·学习
翼龙云_cloud15 小时前
腾讯云国际站代理商: COS 对象存储 + CDN加速 从创建到加速完成
运维·服务器·云计算·腾讯云