linux 使用标准IO函数实现图片本地下载
时间: 2023-12-13 15:02:59 浏览: 167
可以使用标准IO函数来实现图片本地下载。以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#define MAXLINE 1024
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "usage: %s <url>\n", argv[0]);
exit(1);
}
char *url = argv[1];
char *filename = strrchr(url, '/') + 1;
char *hostname = url + strlen("http://");
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket error");
exit(1);
}
struct hostent *he = gethostbyname(hostname);
if (he == NULL) {
perror("gethostbyname error");
exit(1);
}
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
server_addr.sin_addr = *((struct in_addr *)he->h_addr);
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect error");
exit(1);
}
char request[MAXLINE];
snprintf(request, MAXLINE, "GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n", filename, hostname);
if (write(sockfd, request, strlen(request)) < 0) {
perror("write error");
exit(1);
}
char response[MAXLINE];
int nread;
while ((nread = read(sockfd, response, MAXLINE)) > 0) {
if (strstr(response, "\r\n\r\n") != NULL) {
break;
}
}
char *image_data = strstr(response, "\r\n\r\n") + 4;
int image_size = nread - (image_data - response);
int fd = open(filename, O_CREAT | O_WRONLY, 0644);
if (fd < 0) {
perror("open error");
exit(1);
}
if (write(fd, image_data, image_size) < 0) {
perror("write error");
exit(1);
}
close(sockfd);
close(fd);
return 0;
}
```
这个程序使用 `socket` 函数创建一个 TCP 套接字,使用 `gethostbyname` 函数获取主机名对应的 IP 地址,使用 `connect` 函数连接到主机的 HTTP 端口,构造 HTTP 请求报文,使用 `write` 函数向主机发送请求报文,使用 `read` 函数从主机接收响应报文,从响应报文中提取图片数据,使用标准IO函数将图片数据写入本地文件。
阅读全文