http服务器下载文件
2016-01-29 17:17
561 查看
http服务器下载文件
代码如下:
mydown.c
编译链接运行, 输出如下:
可能是http请求的头域中缺少必须的头域信息. 收到了400错误.
代码如下:
mydown.c
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <netdb.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //#include "tcp.h" #define DEFAULT_PORT 80 int main( int argc, char ** argv ) { char *p = NULL; char path[1024]; char hostname[100]; char *purl = argv[1]; char request[200]; char recv_buf[1400]; int recv_count; int sock_fd; int ret; int iLoop = 0; struct hostent *host; struct sockaddr_in server_addr; if(argc != 2) { printf("Usage: %s URL\n", argv[0]); exit(1); } p = strchr(purl, ':'); /* http://www.baidu.com/filename.txt */ p = strchr(p + 3, '/'); /* https://www.baidu.com/filename.txt */ strcpy(path, p); *p = '\0'; printf("---path: %s---\n", path); p = strchr(purl, ':'); /* https://www.baidu.com/filename.txt */ strcpy(hostname, p + 3); printf("---hostname: %s---\n", hostname); printf("正在进行域名解析: %s...\n", hostname); host = gethostbyname(hostname); if(host == NULL) { perror("gethostbyname"); exit(1); } sock_fd = socket(AF_INET, SOCK_STREAM, 0); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(DEFAULT_PORT); memcpy(&server_addr.sin_addr, host->h_addr, sizeof(int)); printf("正在连接服务器: %s...\n", hostname); ret = connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)); if(ret == -1) { perror("connect"); exit(2); } sprintf(request, "GET %s HTTP/1.1\r\nHost: %s: %d\r\nRange: bytes=0-\r\n\r\n", path, hostname, DEFAULT_PORT); //sprintf(request, "GET %s HTTP/1.1\r\nHost: %s: %d\r\nRange: bytes=1-\r\n\r\n", path, hostname, DEFAULT_PORT); //sprintf(request, "GET %s HTTP/1.1\r\nHost: %s: %d\r\nRange: bytes=2-\r\n\r\n", path, hostname, DEFAULT_PORT); //sprintf(request, "HEAD %s HTTP/1.1\r\nHost: %s: %d\r\nRange: bytes=1-\r\n\r\n", path, hostname, DEFAULT_PORT); printf("正在发送下载请求...\n"); send(sock_fd, request, strlen(request)+1, 0); printf("正在接受服务器数据...\n"); while(1) { iLoop++; bzero(recv_buf, sizeof(recv_buf)); recv_count = recv(sock_fd, recv_buf, sizeof(recv_buf) - 1, 0); if((recv_count == 0) /* || (recv_count < sizeof(recv_buf) - 1) */) { //printf("接受完毕(iLoop = %d).\n", iLoop); printf("接受完毕(recv_count = %d).\n", iLoop); break; } printf("%s", recv_buf); //write(write_fd, recv_buf, recv_count); } close(sock_fd); return 0; }
编译链接运行, 输出如下:
可能是http请求的头域中缺少必须的头域信息. 收到了400错误.
相关文章推荐
- 判断网络 比较苦逼 无法判断路由器 的WiFi 是否连接到网络
- Volley用OkHttp3作为底部的框架的一个解决方案
- Http Request header/Response header
- 通过Volley我们能学到什么?(2) — 刨析网络请求框架
- hdu 5438 hdu 5438 Ponds(长春网络赛 拓扑+bfs)
- lighttpd 的安装和使用
- TCP连接的建立和断开
- linux网络编程实例
- 计算机网络和因特网大二暑假
- Socket 模拟Http协议发送图片文件 c#篇
- C#模拟Http与Https请求框架类实例
- iOS网络请求之NSURLSession
- C#中HttpWebRequest的用法详解
- HTTP 缓存策略
- tcpdump and wireshark
- linux网络服务
- 【复习笔记】人工神经网络
- Apatche httpd + Django + Mysql web server 搭建
- HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
- 官方详解/proc/net/tcp