用C编写客户端下载文件
时间: 2023-07-27 16:12:26 浏览: 63
以下是一个简单的C语言程序,可以用来下载文件:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int sockfd, bytes_received;
char buffer[BUFFER_SIZE];
struct hostent *host;
struct sockaddr_in server_addr;
if (argc != 3) {
fprintf(stderr, "Usage: %s <hostname> <filename>\n", argv[0]);
exit(1);
}
// 获取主机信息
if ((host = gethostbyname(argv[1])) == NULL) {
perror("gethostbyname");
exit(1);
}
// 创建socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
// 初始化服务器地址
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
memset(&(server_addr.sin_zero), 0, 8);
// 连接到服务器
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
// 构造HTTP请求
sprintf(buffer, "GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", argv[2], argv[1]);
// 发送HTTP请求
if (send(sockfd, buffer, strlen(buffer), 0) == -1) {
perror("send");
exit(1);
}
// 接收文件并写入本地文件
FILE *fp = fopen(argv[2], "wb");
while ((bytes_received = recv(sockfd, buffer, BUFFER_SIZE, 0)) > 0) {
fwrite(buffer, sizeof(char), bytes_received, fp);
}
fclose(fp);
// 关闭socket
close(sockfd);
return 0;
}
```
这个程序可以从指定的主机下载指定的文件,并将其保存在本地。要使用这个程序,只需要在终端中执行以下命令:
```
$ gcc download.c -o download
$ ./download hostname filename
```
其中,`hostname` 是要下载的文件所在的主机名,`filename` 是要下载的文件名。