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

相关推荐
变量探索SEQVEC1 小时前
一个网段里 10 个 IP,其实是同一个人:13 天蜜罐日志的攻击者画像
服务器
OsDepK1 小时前
OSMDE_v1.9.0已加入FTP与shell功能
linux·运维·服务器
剑锋所指,所向披靡!1 小时前
HTTP服务器的基本相关概念
服务器·网络协议·http
硅基手札2 小时前
【Linux内核专栏 11】驱动框架:platform / char / misc / 设备树
linux·运维·服务器
2301_777998342 小时前
TCP协议:滑动窗口与流量控制
服务器·网络·网络协议·tcp/ip·php
well06123 小时前
Linux 文件相关底层知识
linux·运维·服务器
库拉镜像AI牛牛4 小时前
漫剧工作室量产方案:依托知漫剧 AI 短剧降本增效
大数据·服务器·前端·人工智能·语音识别
沫璃染墨5 小时前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
姜鱼问生5 小时前
宝塔面板优雅下线:先 stop 再 disable 再 rm
运维·服务器
闭包不眠6 小时前
PDF文字提取交付前该检查什么
运维·服务器·图像处理·人工智能·计算机视觉·pdf