Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3964985
  • 博文数量: 366
  • 博客积分: 9916
  • 博客等级: 中将
  • 技术积分: 7195
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-29 23:27
个人简介

简单!

文章分类

全部博文(366)

文章存档

2013年(51)

2012年(269)

2011年(46)

分类: C/C++

2012-03-20 16:18:41

/******* http客户端程序 httpclient.c ************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


/********************************************
功能:搜索字符串右边起的第一个匹配字符
********************************************/
char * Rstrchr(char *s, char x)
{
    int i = 0;

    if(s == NULL)
        return NULL;

    i = strlen(s);

    while(s[i-1])
    {
        if(strchr(s+(i-1),x))
            return (s+(i-1));
        else
            i--;
    }

    return NULL;
}

/**************************************************************
功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件
***************************************************************/
void get_host_info(char *src, char *web, char *file, int *port)
{
    char *pA;
    char *pB;

    memset(web, 0, sizeof(web));
    memset(file, 0, sizeof(file));
    *port = 0;

    if(src == NULL)
        return;

    pA = src;
    if(!strncmp(pA, "http://", strlen("http://")))
        pA = src+strlen("http://");
    else if(!strncmp(pA, "https://", strlen("https://")))
        pA = src+strlen("https://");
    pB = strchr(pA, '/');
    if(pB)
    {
        memcpy(web, pA, strlen(pA) - strlen(pB));
        if(pB+1)
        {
            memcpy(file, pB + 1, strlen(pB) - 1);
            file[strlen(pB) - 1] = 0;
        }
    }
    else
        memcpy(web, pA, strlen(pA));

    if(pB)
        web[strlen(pA) - strlen(pB)] = 0;
    else
        web[strlen(pA)] = 0;

    pA = strchr(web, ':');
    if(pA)
        *port = atoi(pA + 1);
    else
        *port = 80;
}

int main(int argc, char **argv)
{    
    int i = 0;
    char * pt;
    int sockfd;
    int len = 0, totalsend = 0;
    int portnumber,nbytes;
    FILE * fp = NULL;
    struct sockaddr_in server_addr;
    struct hostent *host;
    char buffer[1024];
    char host_addr[256];
    char host_file[1024];
    char local_file[256];
    char request[1024];
    
    if(argc != 2)
    {
        fprintf(stderr,"Usage:%s web-address\a\n",argv[0]);
        exit(1);
    }

    get_host_info(argv[1], host_addr, host_file, &portnumber);
    printf("webhost:%s,hostfile:%s,portnumber:%d\n", host_addr,host_file,portnumber);

    if((host = gethostbyname(host_addr)) == NULL)
    {
        fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
        exit(1);
    }

    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) <= 0)
    {
        fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
        exit(1);
    }

    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(portnumber);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);

    if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr)) < 0)
    {
        fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
        exit(1);
    }
 
    sprintf(request, "GET /%s HTTP/1.1\r\n Accept-Language: zh-cn\r\n Host: %s:%d\r\n Connection: Close\r\n\r\n", host_file, host_addr, portnumber);
    printf("request:%s\n", request);

    if(host_file && *host_file)
        pt = Rstrchr(host_file, '/');
    else
        pt = 0;

    memset(local_file, 0, sizeof(local_file));
    if(pt && *pt)
    {
        if((pt + 1) && *(pt+1))
            strcpy(local_file, pt + 1);
        else
            memcpy(local_file, host_file, strlen(host_file) - 1);
    }
    else if(host_file && *host_file)
            strcpy(local_file, host_file);
    else
            strcpy(local_file, "index.html");
    printf("local filename to write:%s\n\n", local_file);

    nbytes = strlen(request);
    while(totalsend < nbytes)
    {
        if((len = send(sockfd, request+totalsend, nbytes-totalsend, 0)) < 0)
        {
            printf("send error!%s\n", strerror(errno));
            close(sockfd);
            exit(0);
        }
        totalsend += len;
        printf("%d bytes send OK!\n", totalsend);
    }

    fp = fopen(local_file, "a");
    if(fp == NULL)
    {
        printf("create file error! %s\n", strerror(errno));
        close(sockfd);
        return 0;
    }
    printf("\nThe following is the response header:\n");

    while((nbytes = recv(sockfd, buffer, 1, 0)) == 1)
    {
        if(i > 4)
        {
            if(buffer[0] == '\r' || buffer[0] == '\n')
                i++;
            else
                i = 0;
            printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
        }
        else
        {
            fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
            i++;
            if(i%1024 == 0)
                fflush(fp);
        }
    }

    fclose(fp);
    close(sockfd);

    exit(0);
}


阅读(2064) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~