用C编译用客户端下载文件的代码
时间: 2023-12-11 18:02:22 浏览: 23
以下是一个简单的用C编写的客户端程序,可以下载指定URL的文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s <server-ip> <file-url>\n", argv[0]);
return 1;
}
char *server_ip = argv[1];
char *file_url = argv[2];
// 创建套接字
int client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (client_socket < 0) {
perror("socket creation failed");
return 1;
}
// 设置服务器地址
struct sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(80);
if (inet_pton(AF_INET, server_ip, &server_address.sin_addr) <= 0) {
perror("invalid server IP address");
return 1;
}
// 连接服务器
if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("connection failed");
return 1;
}
// 构造HTTP请求报文
char request[BUFFER_SIZE];
snprintf(request, BUFFER_SIZE, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", file_url, server_ip);
// 发送HTTP请求报文
if (send(client_socket, request, strlen(request), 0) < 0) {
perror("send failed");
return 1;
}
// 接收HTTP响应报文
char response[BUFFER_SIZE];
int total_bytes = 0;
int bytes_received;
while ((bytes_received = recv(client_socket, response + total_bytes, BUFFER_SIZE - total_bytes, 0)) > 0) {
total_bytes += bytes_received;
}
if (bytes_received < 0) {
perror("receive failed");
return 1;
}
// 输出HTTP响应报文的正文部分到文件
char *content_start = strstr(response, "\r\n\r\n") + 4;
int content_length = total_bytes - (content_start - response);
char *file_name_start = strrchr(file_url, '/') + 1;
char file_name[256];
snprintf(file_name, 256, "%s", file_name_start);
FILE *fp = fopen(file_name, "wb");
fwrite(content_start, content_length, 1, fp);
fclose(fp);
// 关闭套接字
close(client_socket);
return 0;
}
```
该程序实现了基本的HTTP GET请求,使用方法如下:
```
./client <server-ip> <file-url>
```
其中,`<server-ip>` 是服务器的IP地址,`<file-url>` 是要下载的文件的URL。
注意,该程序仅适用于下载HTTP协议的文件,对于其他协议或加密连接,需要做相应的修改。