要能用的那种,急用在线等!
(如果有需要额外下载库的请说明,最好有下载方式)
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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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文件加载里面的的资源