凯凯本凯 2021-08-29 15:39 采纳率: 72.5%
浏览 31
已结题

C++如何实现HTTP GET方法?

要能用的那种,急用在线等!
(如果有需要额外下载库的请说明,最好有下载方式)

  • 写回答

1条回答 默认 最新

  • 急速光粒 2021-08-29 16:48
    关注

    帮另一个同学改的,http get下载的代码。有限制,如需要可自行修改。

     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/epoll.h>
    void http_parse_request_cmd(char *buf, char *file_name, char *suffix);
    char*http_get_type_by_suffix(const char*suffix);
    int fsize(FILE *fp);
    struct doc_type{
    char*suffix;
    char*type;};
    struct doc_type file_type[]=
    {
    {"html","text/html"},
    {"ico","image-xicon"},
    {NULL,NULL}};
    char*http_res_hdr_tmpl="HTTP/1.1 200 OK\nServer: bianchengbang\n"
    "Accept-Ranges: bytes\nContent-Length: %d\nConnection: closed\n"
    "Content-Type: %s\n\n";
    int main(){
    int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr =  inet_addr("192.168.137.128");
    serv_addr.sin_port = htons(1234);
    int isbind=bind(serv_sock, (struct sockaddr*)&serv_addr,sizeof(serv_addr));
    if (listen(serv_sock, 20) == -1) {
    printf("listen errno\n");
    close(serv_sock);
    return 0;
    }
    int epfd=epoll_create(50);
    struct epoll_event event;
    struct epoll_event* ep_events=(struct epoll_event*)malloc(sizeof(struct epoll_event) * 50);
    event.events = EPOLLIN;
    event.data.fd = serv_sock;
    epoll_ctl(epfd, EPOLL_CTL_ADD, serv_sock, &event);
    while(1){
    int event_cnt = epoll_wait(epfd, ep_events, 50, -1);
    if (event_cnt == -1) {
    printf("epoll_wait() errno\n");
    break;
    }
    for (int i = 0; i < event_cnt; i++) {
    if (ep_events[i].data.fd == serv_sock) {
    struct sockaddr_in clnt_addr;
    socklen_t adr_sz=sizeof(clnt_addr);
    int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &adr_sz);
    event.events = EPOLLIN;
    event.data.fd = clnt_sock;
    epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event);
    }
    else{
    char buf[300]={0};
    memset(buf, 0, 300);
    int num=read(ep_events[i].data.fd, buf, 100);
    if(num>0){
    char file_name[100]={0};
    memset(file_name, 0, 100);
    char suffix[100]={0};
    memset(suffix, 0, 100);
    http_parse_request_cmd(buf, file_name, suffix);
    FILE *fp;
    if((fp = fopen(file_name, "rb"))==NULL){
    printf("服务器不存在%s文件",file_name);
    fp=fopen("errno.html", "rb");
    memset(suffix, 0, 100);
    strcpy(suffix, "html");
    }
    else{
    printf("服务器存在%s文件,发送中...",file_name);
    }
    int n=0;
    if(fp)
    {
        n = fsize(fp);
        char*type=http_get_type_by_suffix(suffix);
        memset(buf, 0, 300);
        if(n>300)n=300;
        sprintf(buf,http_res_hdr_tmpl,n,type);
        write(ep_events[i].data.fd,buf,strlen(buf));
        memset(buf, 0, 300);
        fread(buf, 1,n,fp);
        write(ep_events[i].data.fd,buf,n;
        fclose(fp);
    }
    }
    else{
    epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL);
    close(ep_events[i].data.fd);}
    }
    }
    }
    close(serv_sock);
    close(epfd);
    return 0;
    }
    int fsize(FILE *fp){
        int n;
        fpos_t fpos;  
        fgetpos(fp, &fpos);  
        fseek(fp, 0, SEEK_END);
        n = ftell(fp);
        fsetpos(fp,&fpos);  
        return n;
    }
    void http_parse_request_cmd(char *buf, char *file_name, char *suffix)
    {
    int file_length = 0, suffix_length = 0;
    char *begin = NULL, *end = NULL, *bias = NULL;
    begin = strchr(buf, ' ');
    begin += 1;
    end = strchr(begin, ' ');
    *end = 0;
    file_length = end - begin - 1;
    memcpy(file_name, begin + 1, file_length);
    file_name[file_length] = 0;
    bias = strrchr(begin, '/');
    suffix_length = end - bias;
    if (bias && *bias == '/')
    {
    bias++;
    suffix_length--;
    }
    if (suffix_length > 0)
    {
    begin = strchr(file_name, '.');
    if (begin)
    strcpy(suffix, begin + 1);
    }
    }
    char*http_get_type_by_suffix(const char*suffix)
    {int i;
    for(i=0;file_type[i].suffix;i++){
    if(!strcmp(file_type[i].suffix,suffix))
    return file_type[i].type;
    }
    return NULL;
    }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月24日
  • 已采纳回答 10月16日
  • 创建了问题 8月29日

悬赏问题

  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源