将如下代码改成一个函数#include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <openssl/ssl.h> #include <openssl/err.h> #define MAX_BUF_SIZE 1024 int main(int argc, char *argv[]) { int sockfd, ret; char *url = argv[1]; // 输入的 url char *cert_path = argv[2]; // 输入的证书路径 struct sockaddr_in servaddr; SSL_CTX *ctx; SSL *ssl; char buf[MAX_BUF_SIZE]; // 初始化 SSL 库 SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); // 创建 SSL 上下文 ctx = SSL_CTX_new(TLS_client_method()); if (ctx == NULL) { printf("SSL_CTX_new error.\n"); return -1; } // 加载证书 ret = SSL_CTX_load_verify_locations(ctx, cert_path, NULL); if (ret != 1) { printf("SSL_CTX_load_verify_locations error.\n"); return -1; } // 创建 socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { printf("socket error.\n"); return -1; } // 设置服务器地址 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(443); inet_pton(AF_INET, url, &servaddr.sin_addr); // 连接服务器 ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret < 0) { printf("connect error.\n"); return -1; } // 创建 SSL 对象 ssl = SSL_new(ctx); if (ssl == NULL) { printf("SSL_new error.\n"); return -1; } SSL_set_fd(ssl, sockfd); // 建立 SSL 连接 ret = SSL_connect(ssl); if (ret != 1) { printf("SSL_connect error.\n"); return -1; } // 发送请求 char *request = "GET / HTTP/1.1\r\nHost: %s\r\n\r\n"; sprintf(buf, request, url); SSL_write(ssl, buf, strlen(buf)); // 接收响应 while (1) { memset(buf, 0, sizeof(buf)); ret = SSL_read(ssl, buf, sizeof(buf) - 1); if (ret < 0) { printf("SSL_read error.\n"); break; } else if (ret == 0) { break; } else { printf("%s", buf); } } // 关闭 SSL 连接 SSL_shutdown(ssl); SSL_free(ssl); // 关闭 socket close(sockfd); // 清理 SSL 上下文 SSL_CTX_free(ctx); return 0; }
时间: 2024-01-25 15:04:43 浏览: 318
udp.tar.gz_UDP_udp client_udp linux _udp server
好的,下面是将代码改写成一个函数的结果:
```
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define MAX_BUF_SIZE 1024
int https_request(const char *url, const char *cert_path) {
int sockfd, ret;
struct sockaddr_in servaddr;
SSL_CTX *ctx;
SSL *ssl;
char buf[MAX_BUF_SIZE];
// 初始化 SSL 库
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
// 创建 SSL 上下文
ctx = SSL_CTX_new(TLS_client_method());
if (ctx == NULL) {
printf("SSL_CTX_new error.\n");
return -1;
}
// 加载证书
ret = SSL_CTX_load_verify_locations(ctx, cert_path, NULL);
if (ret != 1) {
printf("SSL_CTX_load_verify_locations error.\n");
return -1;
}
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("socket error.\n");
return -1;
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(443);
inet_pton(AF_INET, url, &servaddr.sin_addr);
// 连接服务器
ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if (ret < 0) {
printf("connect error.\n");
return -1;
}
// 创建 SSL 对象
ssl = SSL_new(ctx);
if (ssl == NULL) {
printf("SSL_new error.\n");
return -1;
}
SSL_set_fd(ssl, sockfd);
// 建立 SSL 连接
ret = SSL_connect(ssl);
if (ret != 1) {
printf("SSL_connect error.\n");
return -1;
}
// 发送请求
char *request = "GET / HTTP/1.1\r\nHost: %s\r\n\r\n";
sprintf(buf, request, url);
SSL_write(ssl, buf, strlen(buf));
// 接收响应
while (1) {
memset(buf, 0, sizeof(buf));
ret = SSL_read(ssl, buf, sizeof(buf) - 1);
if (ret < 0) {
printf("SSL_read error.\n");
break;
} else if (ret == 0) {
break;
} else {
printf("%s", buf);
}
}
// 关闭 SSL 连接
SSL_shutdown(ssl);
SSL_free(ssl);
// 关闭 socket
close(sockfd);
// 清理 SSL 上下文
SSL_CTX_free(ctx);
return 0;
}
```
函数名称为 `https_request`,接受两个参数,分别是 `url` 和 `cert_path`。函数返回值为整型,表示函数执行结果。在函数内部,我们使用了原始代码中的大部分代码,只是将 `main` 函数中的一些变量名做了一些修改,以符合函数的参数列表。
阅读全文