windows编译openssl mongoose
windows编译openssl mongoose
重点是编译支持openssl mongoose vistual studio 2022 指定openssl位置
注意openssl文件位置




http-restful-server-7.12.c
// Copyright (c) 2020 Cesanta Software Limited
// All rights reserved
//
// HTTP server example. This server serves both static and dynamic content.
// It opens two ports: plain HTTP on port 8000 and HTTP on port 8443.
// It implements the following endpoints:
// /api/stats – respond with free-formatted stats on current connections
// /api/f2/:id – wildcard example, respond with JSON string {“result”: “URI”}
// any other URI serves static files from s_root_dir
//
// To enable SSL/TLS (using self-signed certificates in PEM files),
// 1. See https://mongoose.ws/tutorials/tls/#how-to-build
// 2. curl -k https://127.0.0.1:8443
//linux
//gcc http-restful-server-7.12.c mongoose.c -W -Wall -Wextra -g -I. -DMG_ENABLE_OPENSSL=1 -I/opt/openAI/Lib64U/include -I-L /opt/openAI/Lib64U/lib64/libssl.so.3 /opt/openAI/Lib64U/lib64/libcrypto.so.3 -o httpdm
#//define _CRT_SECURE_NO_WARNINGS
#include “mongoose.h”
#ifdef _WIN32 // std::cout << “Windows\n”;
;;
//OPENSSL_Uplink(00007FFACC2F1068,08): no OPENSSL_Applink
;;//openssl编程出现no OPENSSL_Applink
#ifdef __cplusplus
extern “C” {
#endif
#include “openssl/applink.c”
#ifdef __cplusplus
}
#endif
//#include “mongoose.c”
#elif __linux__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <ctype.h>//isspace
#define MAX_PATH 250
#include <unistd.h>
#include <linux/limits.h>
#elif __APPLE__ // std::cout << “Apple\n”;
;;
#endif
static const char* s_http_addr = “http://0.0.0.0:8000”; // HTTP port
static const char* s_https_addr = “https://0.0.0.0:8443”; // HTTPS port
static const char* s_root_dir = “.”;
//#define TLS_TWOWAY 1
// Self signed certificates
// https://mongoose.ws/documentation/tutorials/tls/#self-signed-certificates
#ifdef TLS_TWOWAY
static const char* s_tls_ca =
“—–BEGIN CERTIFICATE—–\n”
“MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw\n”
“ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n”
“A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\n”
“BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y\n”
“ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg\n”
“VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM\n”
“UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs\n”
“Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm\n”
“qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c\n”
“Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf\n”
“IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5\n”
“8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB\n”
“Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8\n”
“SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY\n”
“1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB\n”
“JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE\n”
“FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E\n”
“CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE\n”
“GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo\n”
“dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy\n”
“bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k\n”
“b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY\n”
“eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO\n”
“2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4\n”
“3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP\n”
“v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s\n”
“Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==\n”
“—–END CERTIFICATE—– \n”;
#endif
static const char* s_tls_cert =
“—–BEGIN CERTIFICATE—–\n”
“MIIF9zCCBF+gAwIBAgIRANMTq1cygkAfVudXOkLcVlgwDQYJKoZIhvcNAQEMBQAw\n”
“WTELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs\n”
“IEluYy4xIzAhBgNVBAMTGlRydXN0QXNpYSBSU0EgRFYgVExTIENBIEcyMB4XDTIz\n”
“MDkyOTAwMDAwMFoXDTIzMTIyODIzNTk1OVowHjEcMBoGA1UEAxMTZnJlZXNzbC56\n”
“aG9uamluLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJJvjmFU\n”
“mf0G5KcKj0OrG+DCyeN/q1HxlDKt92rUWoQbUb32ULRLaB6yCebS77A4RVfZ1Map\n”
“luYKfa4UGlafY1OPWkMtvKtMO1pRS3pzYaPzU9KUReKrb1zgJky12gIeZHqoWUNM\n”
“KOcrNWhkcHf8FXV1gM/6K3X1QkU3vLqdXqTBIsujGjBQDgY0G/lW+AMNde5ZX4kX\n”
“l/qR4zDhbZLIG/WvijfbsOaW9XJx4noWW1J+zmOULJJtVjBcVhOMdxLlaqyYwKki\n”
“PYqWePxt7SjunafO9tU03YlBWMRJB4mkdzYzSzPCK7fboTykda+FgZRtweCYOoDr\n”
“NbGIVk4wLPIZWgMCAwEAAaOCAnMwggJvMB8GA1UdIwQYMBaAFF86fBEQfgxncWHc\n”
“i6O1AANn9VccMB0GA1UdDgQWBBRBQJk4sGA9XPS2BdQQKqkoImb2SjAOBgNVHQ8B\n”
“Af8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB\n”
“BQUHAwIwSQYDVR0gBEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIBFhdo\n”
“dHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEEcTBv\n”
“MEIGCCsGAQUFBzAChjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1RydXN0\n”
“QXNpYVJTQURWVExTQ0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnRy\n”
“dXN0LXByb3ZpZGVyLmNuMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHUArfe++nz/\n”
“EMiLnT2cHj4YarRnKV3PsQwkyoWGNOvcgooAAAGK4T0V0gAABAMARjBEAiBBJXJk\n”
“JhNuvem4Mcm6KSl8cRE9rSERXYOoB4nG3nBkzAIgCjp6AhetkKXHbmMK7WoAL4k9\n”
“EjvgAIjZ68/TvzSoB+cAdwB6MoxU2LcttiDqOOBSHumEFnAyE4VNO9IrwTpXo1Lr\n”
“UgAAAYrhPRYyAAAEAwBIMEYCIQCE0wo20sXXtP2hNKaE0xY6YWWCiUdQZDMVn6SG\n”
“+pdHyAIhALvEmR82QUhqzGXGkwSmYHAg4CghNzpt43UAKokG9bvRMB4GA1UdEQQX\n”
“MBWCE2ZyZWVzc2wuemhvbmppbi5jb20wDQYJKoZIhvcNAQEMBQADggGBACLj5HJG\n”
“zKaJTF6mbTkpCxfPZdn9aZMxw7ADOF4KPhCIRSAQ51WzcC5hqX5mhmBFxRRjcYDj\n”
“7sRBx5to52DdC6sMsrbXDgHmgYlHZ5bkAadJzy5qkBh8okz9PYVxTiLyFDGnaeNw\n”
“t1BvPIZGK9fIQEkLNpf7VjCQDQoKP7mbMXMS2KaQUtVHha+y3s8uvQuo4CyGdHm0\n”
“2Wuw7/DRl4W5qdT/j2svsDxfSIvWFVjUCYJLwb1V+OZw6mHiEU9TknAKDluYtCMj\n”
“wY8K30IZDci2rGzDab45KAhrqwnZ/At915b8zLkpd42XpF4ZGWYGvuT93cp3mNWE\n”
“wpM8Kf35zuIG5x9EarjYqzOSS8En+ijktoEFOiVAsvrF+f2LhK0vgyYvt5SmV1WI\n”
“/+JZogZweMPK1LSyz/a1al25VVluo6rcyDg+8uXMJ+UVZfsuHsKBY8hpmHxOCFAk\n”
“Q2R9fAnykqTmBLOUykwcKI7mNZgb46YC0yu91o4ASzakMsfSrtoEqpu50g==\n”
“—–END CERTIFICATE—–\n”;
static const char* s_tls_key =
“—–BEGIN PRIVATE KEY—–\n”
“MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCSb45hVJn9BuSn\n”
“Co9Dqxvgwsnjf6tR8ZQyrfdq1FqEG1G99lC0S2gesgnm0u+wOEVX2dTGqZbmCn2u\n”
“FBpWn2NTj1pDLbyrTDtaUUt6c2Gj81PSlEXiq29c4CZMtdoCHmR6qFlDTCjnKzVo\n”
“ZHB3/BV1dYDP+it19UJFN7y6nV6kwSLLoxowUA4GNBv5VvgDDXXuWV+JF5f6keMw\n”
“4W2SyBv1r4o327DmlvVyceJ6FltSfs5jlCySbVYwXFYTjHcS5WqsmMCpIj2Klnj8\n”
“be0o7p2nzvbVNN2JQVjESQeJpHc2M0szwiu326E8pHWvhYGUbcHgmDqA6zWxiFZO\n”
“MCzyGVoDAgMBAAECggEAHKhDQ230ks16Cuyom9QNKR/FtcVi6C7wUzizbk8vhaH5\n”
“DcV6BsapEjTCdk86hBCHFYm2N8ixlMRh0yLxApm/rPclcXcucJGDHgpBzK1u4tB4\n”
“S4Ij6RemvBTLugBusTJ0dIKksWRirtbIZW0ei4SkSG/d7RWm0rdUKEqfnx+0CWbM\n”
“1wtxV4OEfYOejesFGzufx9sfn8jFW8mfKW6i60qtnPw4wWxGKDBmKt3JLl0YnoNt\n”
“DZUAOvJm48IirbQ3qkUrahgsNQuy0fiNd16xycJ+hp64bEs2/aVCh5kJQAXtli12\n”
“OU3PVZPh9tTx2CcU/IXqwFNiwWeWIErfITXAE68luQKBgQDE0wXSs1ghHPdeGJbf\n”
“SUzqEuZBa5+0ThX2RWQ8TOdlfpWP2qqiz8LdFqmyCPpDIlp8LEjMl63V9jswmfOI\n”
“Csx0qGQ6wNYp9EjA92FLoCs1A6owCOAetgpq1JlNdc+asz+YWJpkdIiTsdPjnMJ+\n”
“WhQOsQgeSfS6BBVGu7WAdsS6yQKBgQC+dkdDTCDp6Awlq5/uIBqG24qZ65mKGd3X\n”
“ZtPNiwcwIS0LkR4Z6AfVvvSR4n0DAhAR9r3wwIqW7bsuR9k8/JBUWmvyVkerAIjV\n”
“EsnrtRbgc0GRfnu99aaktHup43bbQH5N86fpDEUPWChP8W39PN4H5GZhuG2V0WC/\n”
“tavmY0EIawKBgAUYtcDj9fc9icY8+sMjYcN5485z2/nOP9FVsKfDEgbVxUepUNvQ\n”
“Z2pUKOa8RsawQAmRF/18O/sbWiMDCYRPS0YGCjpfPexuL+gXP8S2jAfeZWzC/hKt\n”
“gg2MHcAcudh2pcHrIWxSfCre4u6043BkIrrSqLQoFBcw/eAMAkImUSfJAoGAKh9C\n”
“d3G4vcJiHVqtjh5vf2/CYXQnitFZrK/DG+wpdM2BhtNbUuNsCCupLzJl72pfX3mw\n”
“XDRY8jQ1d3DQbJp22RD+WqQWSY1etbDoE0cDfjQ/RgwxFbvkVPzNdK8ntCm5RUgj\n”
“1HiwNUqL79I3PxBdEmXC9s2w/rdFrGBjWhqNYW0CgYA+FuEd//gz3bd2gfEpR4Tt\n”
“Orn3sNGVDJ8bqtx83qi/SOGSg8mPp2hjsr6D3W2SssrajNiYn/2Q0zNQ25Wp/vjg\n”
“G5HRbE28O87yQSV3evNAbVSxZBppIwGif4Nmd1OKLdezGmiIfbKhewwQoJnLIjkU\n”
“49ZQmTwRekuqJohfCSA9xA==\n”
“—–END PRIVATE KEY—–\n”;
// We use the same event handler function for HTTP and HTTPS connections
// fn_data is NULL for plain HTTP, and non-NULL for HTTPS
static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data) {
if (ev == MG_EV_ACCEPT && fn_data != NULL) {
struct mg_tls_opts opts = {
#ifdef TLS_TWOWAY
.ca = mg_str(s_tls_ca),
#endif
.cert = mg_str(s_tls_cert),
.key = mg_str(s_tls_key)
};
mg_tls_init(c, &opts);
}
if (ev == MG_EV_HTTP_MSG) {
struct mg_http_message* hm = (struct mg_http_message*)ev_data;
if (mg_http_match_uri(hm, “/api/stats”)) {
// Print some statistics about currently established connections
mg_printf(c, “HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n”);
mg_http_printf_chunk(c, “ID PROTO TYPE LOCAL REMOTE\n”);
for (struct mg_connection* t = c->mgr->conns; t != NULL; t = t->next) {
mg_http_printf_chunk(c, “%-3lu %4s %s %M %M\n”, t->id,
t->is_udp ? “UDP” : “TCP”,
t->is_listening ? “LISTENING”
: t->is_accepted ? “ACCEPTED “
: “CONNECTED”,
mg_print_ip, &t->loc, mg_print_ip, &t->rem);
}
mg_http_printf_chunk(c, “”); // Don’t forget the last empty chunk
}
else if (mg_http_match_uri(hm, “/api/f2/*”)) {
mg_http_reply(c, 200, “”, “{\”result\”: \”%.*s\”}\n”, (int)hm->uri.len,
hm->uri.ptr);
}
else {
struct mg_http_serve_opts opts = { .root_dir = s_root_dir };
mg_http_serve_dir(c, ev_data, &opts);
}
}
(void)fn_data;
}
int main(void) {
struct mg_mgr mgr; // Event manager
mg_log_set(MG_LL_DEBUG); // Set log level
mg_mgr_init(&mgr); // Initialise event manager
mg_http_listen(&mgr, s_http_addr, fn, NULL); // Create HTTP listener
mg_http_listen(&mgr, s_https_addr, fn, (void*)1); // HTTPS listener
for (;;) mg_mgr_poll(&mgr, 1000); // Infinite event loop
mg_mgr_free(&mgr);
return 0;
}
示例完整源码参考如下vistual studio 2022:
OpenSSL-Win64.20240925.zip 位于
/opt/openAI/windows/OpenSSL-Win64.20240925.zip
OpenSSL-Win64.20240925.zip 注意解压位置:
C:\Users\steven roc\Desktop\openssL-Win64\include
自适应IP