// TestEcho-SSL-Console Server // 基于HP-Socket的SSL服务器控制台程序 #include "pch.h" // SSL证书配置(来自helper.cpp) // 服务端证书 static const char* g_s_lpszPemCert = R"(-----BEGIN CERTIFICATE----- MIIEJjCCAw6gAwIBAgIBAzANBgkqhkiG9w0BAQsFADB7MQswCQYDVQQGEwJDTjEL MAkGA1UECAwCR0QxCzAJBgNVBAcMAkdaMQwwCgYDVQQKDANTU1QxDzANBgNVBAsM Bkplc3NtYTETMBEGA1UEAwwKamVzc21hLm9yZzEeMBwGCSqGSIb3DQEJARYPbGRj c2FhQDIxY24uY29tMCAXDTI0MDYyNjA1MTY1NFoYDzIyNDMwNzA5MDUxNjU0WjBu MQswCQYDVQQGEwJDTjELMAkGA1UECAwCR0QxDDAKBgNVBAoMA1NTVDEPMA0GA1UE CwwGSmVzc21hMRMwEQYDVQQDDApqZXNzbWEub3JnMR4wHAYJKoZIhvcNAQkBFg9s ZGNzYWFAMjFjbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7 x3ilLjZtH2ZKuofj4FpVl/IF2yDI5503YQbwllxp7kNEaqTyjJUgmLlZBbwHQzTD xfPk/nZ/m3xUHsVjwXMZqNNufgtSLaBoK4CvBAOTkELphIOZdJYPpuaU66W0phjG VM2R4EFm/rTXddZ7N6sq3fYEL0bxqUJ6fW/+0QhdNSwfdevdAHgOmGkrTj5rILJ8 A7FwbkcuV5vBWZ+9ZhNG4csqAjH5LLLCn5hJdhE9WqUp+slfIuXE5vZGDpCQrcc5 I1qWt8VNfdwzaBDL/hXl7pAiVpZRvQxyJgbUMLr2QrYFwrPkgpncU7R7AyT/C0tO vgPVZb+IGqbf+NrbHEk3AgMBAAGjgb8wgbwwHwYDVR0jBBgwFoAU3j3PjwPLCagP hw1NCALqefZAmhQwCQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwYgYDVR0RBFswWYIJ bG9jYWxob3N0ggpqZXNzbWEub3JnggwqLmplc3NtYS5vcmeCCmplc3NtYS5jb22C DCouamVzc21hLmNvbYIKamVzc21hLm5ldIIMKi5qZXNzbWEubmV0MB0GA1UdDgQW BBRZ97VSkfue5s8/OkYvUe+lXUgsHzANBgkqhkiG9w0BAQsFAAOCAQEAvM1QrhTL /I1ws4fozKQlfmd3S0AdfFJX4BMTbp88proWpjrNZt6ZJ3EETHKcXu0z4gn3jWy6 1d8bDCytYQXjpG3Na7Ym5jc/E7wc+XUCUxlW41G/HnaLaIVccmRbyxMOWkr3yUX1 tc8rxUSKWzZBmYtJ49QzIvNzDuoLklE44g8XuqsZZlOZ2wRWJxc/hDG0MkKhRnc1 mqeaoY/79QZNE1RvX/aRRJoSl7NQ00/rMP8MU6OMzPvbIsMVK2uT+BVZG0RZJXaG ikQJvxYZrDVZdRZL6tWPtS2wI49KkzGHNH4S1Fni/dDq3P2rxzisMY1gtKQLeVYY eTQDDybjTWWiTg== -----END CERTIFICATE----- )"; // 服务端私钥 static const char* g_s_lpszPemKey = R"(-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFHTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIgAqUxS2ufB0CAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBD8E9f397mpmzmM9zYTWt2DBIIE wIo2i0YH7cT/WCLmSnVvpsbayeo0mbVUFS4xp2VerQUS+UXHlrrOFeKU8NYfG6SS m+3PXksvUlDV9iGT0p/w2Fm1GVKhE7UAeTJkff7KWi2pc926DUbYxhFOUNyCnrQS pWCdV6M/243A0kHg6kIlSblsXjzKMC6eSlh2FGa7M7my9A+nu0WGOqvazkOm/8jk h20xmB3t/Qa8NQp59E9oLXs5+CokIKL17+PmtBKeKpQBxAUtFjcqRAugIiNpPjOS K99cY/Tt1C8ugMIsFH1/4HzFDYiSDRZ630dKOzBruprHVkIvQXI1CW6edPlfFZKG yHeH95kigPVWUxWwluwALVmlPwD4h/GWHGOS7HH6x4ubStogjmC2B9f4VQCd6YRu lee3cdDvdqLoRCoU48SoM/+RMR3NpF508ulWhKrDZ4eGcqdUYrx3rWVyOrmfMJDe kfckGKnhCA1hL3wb/HQuAs2st2lDKBwsYIsOc8UXhueRFHKk+W0O/5kureMPF14O DAxqAW3meHq7CLY8WuqatptIrJVDT8Wkbx47tXhLapTwlI0Cbf2AGfJIWSGmM+VF I5l13pW2tycQnAXzSdd0y9wE0df/EoyXfIJeEfBNkzVhkIIC3KmOiI8BCnei6UR9 jun4+6aeFyfGybJ04ybixXyFsCsVUa5QcnhPwJvC8QsVFpuzOttQ5cf4Xn57DyxT 4CzWieJ6iQpfAJahRcj/4O6KRmWuMPpkK8XsCgzOYM1MxETq4HbqXEp68KiT6Q9r jEAmbfZ8NdPvAPZ/iXKtA/eaMDDy6EbzDscUBg/TSxsF286F+wH2kXvkbwL2E/zh LsTcjsGUdNKxlDJaivi7dDbSzxzvcDYRh+8Bd/vOw2gJF2ohwXXp3GKTVu71LS+b YruQ55Lauh761ziI/z7qZw9ko8erb5vcsqLh9duqtxTBnQEd05ufFhNnXk4Vq8Cp hr30Qy5sJ7TUuAVs2RSuGHd0Q5l8NGLjQwtkDx5ofizZKQOMWTq8S3IA98QyFka0 e+XaGGQ/KZJciIoCkuzAX4mn/aIffMldQIEg5ybslBc326SdTe52ex5YlmUuyvbO zDotjC/eeQEFvq6Xb14N+u7mp8xL5Dlro79aL3VNNGa3lgKP6lWtMjgcyZrWMdc4 xaV0sVbfRO8Pj4y3cZGXol529zSNSIc7wT2/kyvF6RgJEcluAIPAJ8ea6CXKqDfe sYZDL1emVoKMoFy3YsnEI+py2xxSsU4pjGPanZZaVfrDfw3qnQWPovfOx5fVc6Om U55o3nbR5wtjPlQmcdVlT/fo7m/OUu3UgdjyLFcljeezJGeskJ3PMYbSsi7Mf+yF /BEW6IfqicjG9TTMGzNACHH0iqAzW6lrC60UXMRIXrs/segt3+r5JqfRH58TMBR+ O5xk6sjOL4uqTsJRmbMapHf4tPxli8PdvNYN+YTQ4tlwazrckwgC5TJ3GA5JM3Ox ZQIIKf1joemxq/VT2IpsqwMY67KC4OUOiRy471guGdljFarACe8rzZh8BHONveJd XDgM0oPBkR9z4BGlfbBgAG0bIRNSXp8yGaZMiuIHbI8I4TnR84KgyUUscsIlH03A 8PQL73vd5pU4jC6WdOaXwkI= -----END ENCRYPTED PRIVATE KEY----- )"; // CA证书 static const char* g_s_lpszCAPemCert = R"(-----BEGIN CERTIFICATE----- MIID2TCCAsGgAwIBAgIUM8TTtPU+ejzffYXCcs/zZsU7OuIwDQYJKoZIhvcNAQEL BQAwezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJHWjEMMAoG A1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNVBAMMCmplc3NtYS5vcmcx HjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTAgFw0yNDA2MjYwNTA0NDNa GA8yMjcwMTEyNDA1MDQ0M1owezELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQsw CQYDVQQHDAJHWjEMMAoGA1UECgwDU1NUMQ8wDQYDVQQLDAZKZXNzbWExEzARBgNV BAMMCmplc3NtYS5vcmcxHjAcBgkqhkiG9w0BCQEWD2xkY3NhYUAyMWNuLmNvbTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAML+v79+aLQt0Za0dTIZHI5B NDs0g5G8bhdOTlW/kNWflaziZ3GY6d6nJSkQ5e29kyFKxlOD6Gls6bOJ86U71u4R bCmoFvRTDH4q2cJ/+PbiioLpNveDG6lnRCs9JNRQoJrkpRo6urnVnAdsIf6UFjLI dlByNMPGYJ0V8/oKJG5Vu5gcbZV0jVA5+tswkH/zquexEXoKvp18mcwl+pNc/LwW 0WnGj0uoJjxHg4GsS78PASjhxMR/2d/1OpgPauldFaNHjVPtaLqJnuejwA6M6Sz8 iFPybAQAMpHL9W8kf08jtbnFvnm4ibUkQL5h+OJoIEQa9AVZOSoFG2/g5Zcn8X8C AwEAAaNTMFEwHQYDVR0OBBYEFN49z48DywmoD4cNTQgC6nn2QJoUMB8GA1UdIwQY MBaAFN49z48DywmoD4cNTQgC6nn2QJoUMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBALJnYrYBSZLyYX14FQ04zxG3AX0CtQzNOOa7LDrr+H8Ly+nK qS87gg2njMVZH1zM2demtMwydR/F2Ui8ggaduMvc9h5YgQKEwYl8KarJEY03oZoe zbQGBxCXpDOtMs1vujzcl/iZbSzwEDF3g4la5U8q4MlmfGFKz9CJbvoxecqYA206 nNbW2XZsW/xMiQv6iAw5iP/LOR9HAyxcvXIsL790nfcgnTYLmyP254Dj4outc6R+ PA+f/c1FvkbUBTR5vJt2tsvHcNU218rY2hyOIhDmZeUWprqBO19sUk3scLbVPr3+ WEWEl2XaCekKuPtAnMgVQuFsocXGyiuIhkOe5Z4= -----END CERTIFICATE----- )"; static const int g_s_iVerifyMode = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT; static const char* g_s_lpszKeyPassword = "123456"; static const LPCTSTR ADDRESS = _T("0.0.0.0"); static const USHORT PORT = 5555; // 读取文件内容到字节向量 inline std::vector readFile(const std::string& path) { std::ifstream f(path, std::ios::binary); return std::vector(std::istreambuf_iterator(f), {}); } // 服务器监听器类 class CServerListener : public CTcpServerListener { public: virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) override { TCHAR szAddress[100]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); USHORT usPort; pSender->GetListenAddress(szAddress, iAddressLen, usPort); std::wcout << L"[服务器] 准备监听: " << szAddress << L":" << usPort << std::endl; return HR_OK; } virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) override { TCHAR szAddress[100]; int iAddressLen = sizeof(szAddress) / sizeof(TCHAR); USHORT usPort; pSender->GetRemoteAddress(dwConnID, szAddress, iAddressLen, usPort); std::wcout << L"[服务器] 客户端连接: ID=" << dwConnID << L", 地址=" << szAddress << L":" << usPort << std::endl; return HR_OK; } virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) override { std::wcout << L"[服务器] SSL握手完成: ID=" << dwConnID << std::endl; return HR_OK; } virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override { std::string strData((char*)pData, iLength); std::cout << "[服务器] 接收到消息: ID=" << dwConnID << ", 内容=\"" << strData << " from client\"" << std::endl; // 回显数据给客户端 std::string response = "hello!"; std::vector fileData = readFile("Client.exe"); //if (pSender->Send(dwConnID, fileData.data(), (int)fileData.size())) if (pSender->Send(dwConnID, (const BYTE*)response.c_str(), (int)response.size())) { std::cout << "[服务器] 发送数据,长度:" << response.size() << std::endl; } else { std::cout << "[服务器] 发送响应失败" << std::endl; } return HR_OK; } virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override { return HR_OK; } virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) override { if (iErrorCode == SE_OK) { std::wcout << L"[服务器] 客户端断开: ID=" << dwConnID << std::endl; } else { std::wcout << L"[服务器] 客户端连接错误: ID=" << dwConnID << L", 错误码=" << iErrorCode << std::endl; } return HR_OK; } virtual EnHandleResult OnShutdown(ITcpServer* pSender) override { std::wcout << L"[服务器] 服务器关闭" << std::endl; return HR_OK; } }; int main() { // 设置控制台UTF-8编码和locale SetConsoleOutputCP(CP_UTF8); std::locale::global(std::locale("")); std::wcout.imbue(std::locale("")); std::wcout << L"========================================" << std::endl; std::wcout << L" HP-Socket SSL Server 控制台演示程序" << std::endl; std::wcout << L"========================================" << std::endl; std::wcout << std::endl; // 创建监听器和服务器 CServerListener listener; CSSLServerPtr server(&listener); // 初始化SSL上下文 std::wcout << L"[服务器] 正在初始化SSL环境..." << std::endl; if (!server->SetupSSLContextByMemory(g_s_iVerifyMode, g_s_lpszPemCert, g_s_lpszPemKey, g_s_lpszKeyPassword, g_s_lpszCAPemCert)) { std::wcout << L"[服务器] SSL初始化失败!错误码: " << server->GetLastError() << std::endl; std::wcout << L"按任意键退出..." << std::endl; _getch(); return 1; } std::wcout << L"[服务器] SSL环境初始化成功" << std::endl; // 启动服务器 std::wcout << L"[服务器] 正在启动服务器..." << std::endl; if (!server->Start(ADDRESS, PORT)) { std::wcout << L"[服务器] 启动失败!错误码: " << server->GetLastError() << std::endl; std::wcout << L"按任意键退出..." << std::endl; _getch(); return 1; } std::wcout << L"[服务器] 服务器启动成功,监听端口: " << PORT << std::endl; std::wcout << L"[服务器] 按 'Q' 键停止服务器..." << std::endl; std::wcout << std::endl; // 等待用户输入 while (true) { if (_kbhit()) { char ch = _getch(); if (ch == 'q' || ch == 'Q') { break; } } Sleep(100); } // 停止服务器 std::wcout << L"[服务器] 正在停止服务器..." << std::endl; if (server->Stop()) { std::wcout << L"[服务器] 服务器已停止" << std::endl; } // 清理SSL上下文 server->CleanupSSLContext(); std::wcout << L"按任意键退出..." << std::endl; _getch(); return 0; }