zoukankan      html  css  js  c++  java
  • socket上http协议应用(使用socket进行http通信的例子,准备好报头以后,简单read/write就可以了)

    前几天看socket本有点晕,

    好不容易弄明白了,才发现公司服务器用的是http的。

    找了好久也没发现linux下直接用http的api,

    不过今日偶然发现了使用socket进行http通信的例子,

    试了下,没问题,可以连接到服务器,并下载页面。

    有了这一步,下面应该就好走些了,这里发上来,分享一下。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <limits.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <ctype.h>

    int main(int argc, char *argv[])
    {
    int sockfd;
    char buffer[1024];
    struct sockaddr_in server_addr;
    struct hostent *host;
    int portnumber,nbytes;
    char host_addr[256];
    char host_file[1024];
    char local_file[256];
    FILE * fp;
    char request[1024];
    int send, totalsend;
    int i;
    char * pt;

    if(argc!=2)
    {
        fprintf(stderr,"Usage:%s web-addressa ",argv[0]);
        exit(1);
    }
    portnumber=80;
    strcpy(host_addr,argv[1]);
    if((host=gethostbyname(argv[1]))==NULL)/*取得主机IP地址*/
    {
        fprintf(stderr,"Gethostname error, %s ", strerror(errno));
        exit(1);
    }
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*建立SOCKET连接*/
    {
        fprintf(stderr,"Socket Error:%sa ",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))==-1)/*连接网站*/
    {
        fprintf(stderr,"Connect Error:%sa ",strerror(errno));
        exit(1);
    }

    sprintf(request, "GET /%s HTTP/1.1 Accept: */* Accept-Language: zh-cn
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
    Host: %s:%d Connection: Close ", host_file, host_addr, portnumber);
    printf("%s", request);/*准备request,将要发送给主机*/

    /*取得真实的文件名*/
    strcpy(local_file, "index.html");
    /*发送http请求request*/
    send = 0;totalsend = 0;
    nbytes=strlen(request);
    while(totalsend < nbytes) {
        send = write(sockfd, request + totalsend, nbytes - totalsend);
        if(send==-1) {printf("send error!%s ", strerror(errno));exit(0);}
        totalsend+=send;
        printf("%d bytes send OK! ", totalsend);
    }

    fp = fopen(local_file, "a");
    if(!fp) {
        printf("create file error! %s ", strerror(errno));
        return 0;
    }
    printf(" The following is the response header: ");
    i=0;
    /* 连接成功了,接收http响应,response */
    while((nbytes=read(sockfd,buffer,1))==1)
    {
        if(i < 4) {
          if(buffer[0] == ' ' || buffer[0] == ' ') i++;
          else i = 0;
          printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
        }
        else {
          fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
          i++;
          if(i%1024 == 0) fflush(fp);/*每1K时存盘一次*/
        }
    }
    fclose(fp);
    /* 结束通讯 */
    close(sockfd);
    exit(0);

    http://www.cnblogs.com/pingf/archive/2009/06/26/1511522.html

  • 相关阅读:
    Codeforces 1255B Fridge Lockers
    Codeforces 1255A Changing Volume
    Codeforces 1255A Changing Volume
    leetcode 112. 路径总和
    leetcode 129. 求根到叶子节点数字之和
    leetcode 404. 左叶子之和
    leetcode 104. 二叉树的最大深度
    leetcode 235. 二叉搜索树的最近公共祖先
    450. Delete Node in a BST
    树的c++实现--建立一棵树
  • 原文地址:https://www.cnblogs.com/findumars/p/7010320.html
Copyright © 2011-2022 走看看