Добавил:
oih07968
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:решения / client_ssl
.cpp// client_ssl.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
// Обеспечить замену символов из имен файлов в нескольких каталогах. Клиент посылает серверу искомые символы и
// символы для замены. Сервер после завершения операции возвращает результат клиенту в виде имен файлов, где
// было удалено заданное слово. Протокол взаимодействия UDP.
#include <iostream>
#include <string.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
// link with ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
using namespace std;
SOCKET create_socket(int port)
{
WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wsa;
SOCKET s;
struct sockaddr_in addr;
if (WSAStartup(wVersionRequested, &wsa) != 0)
{
cout << "Unable to startup. Error Code: " << WSAGetLastError() << endl;
system("pause");
exit(EXIT_FAILURE);
}
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0)
{
cout << "Unable to create socket" << endl;
WSACleanup();
system("pause");
exit(EXIT_FAILURE);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
//addr.sin_addr.s_addr = inet_pton("74.125.235.20");
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
while (connect(s, (struct sockaddr*)&addr, sizeof(addr)) != 0)
{
cout << "Unable to connect" << endl;
}
return s;
}
void init_openssl()
{
// registers the error strings for all libcrypto functions and also registers the libssl error strings.
SSL_load_error_strings();
// registers the available SSL/TLS ciphers and digests.
SSL_library_init(); // заменено на равнозначное с OpenSSL_add_ssl_algorithms
}
SSL_CTX* create_context()
{
const SSL_METHOD* method;
SSL_CTX* ctx;
// These are the general - purpose version - flexible SSL / TLS methods.
method = TLS_client_method(); // заменены с SSLv23_method на рекомендуемые
if (!method)
{
cout << "Unable to collect SSL method" << endl;
system("pause");
exit(EXIT_FAILURE);
}
// creates a new SSL_CTX object as framework to establish TLS / SSL enabled connections.
ctx = SSL_CTX_new(method);
if (!ctx)
{
cout << "Unable to create SSL context" << endl;
system("pause");
exit(EXIT_FAILURE);
}
return ctx;
}
void configure_context(SSL_CTX* ctx)
{
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
SSL_CTX_set_verify_depth(ctx, 5);
if (!SSL_CTX_load_verify_locations(ctx, "rootca.pem", NULL))
{
cout << "Unable to create SSL context" << endl;
system("pause");
exit(EXIT_FAILURE);
}
}
int main(int argc, char** argv)
{
setlocale(LC_ALL, "Russian");
SOCKET sock;
SSL_CTX* ctx;
init_openssl();
ctx = create_context();
configure_context(ctx);
sock = create_socket(4433);
/* Handle connections */
SSL* ssl = SSL_new(ctx); // create a new SSL structure for a connection
SSL_set_fd(ssl, (int)sock); // connect the SSL object with a file descriptor
if (SSL_connect(ssl) != 1)
{
char* err = new char[1024];
ERR_error_string_n(ERR_get_error(), err, 1024);
cout << err << endl;
delete[] err;
cout << "Unable to execute SSL_connect" << endl;
WSACleanup();
system("pause");
exit(EXIT_FAILURE);
}
// The TLS/SSL handshake was successfully completed
char* input = new char[256];
cout << "Введите папку для поиска: ";
cin >> input;
if (SSL_write(ssl, input, 256) <= 0)
{
char* err = new char[1024];
ERR_error_string_n(ERR_get_error(), err, 1024);
cout << err << endl;
delete[] err;
}
cout << "Введите искомый набор символов: ";
cin >> input;
if (SSL_write(ssl, input, 256) <= 0)
{
char* err = new char[1024];
ERR_error_string_n(ERR_get_error(), err, 1024);
cout << err << endl;
delete[] err;
}
cout << "Введите набор символов для замены: ";
cin >> input;
if (SSL_write(ssl, input, 256) <= 0)
{
char* err = new char[1024];
ERR_error_string_n(ERR_get_error(), err, 1024);
cout << err << endl;
delete[] err;
}
delete[] input;
cout << "Результат:" << endl;
char* reply = new char[256];
while (1)
{
if (SSL_read(ssl, reply, 256) > 0)
{
if (!strcmp(reply, "END")) break;
else cout << reply << endl;
}
}
delete[] reply;
SSL_shutdown(ssl); // shut down a TLS/SSL connection
SSL_free(ssl); // free an allocated SSL structure
closesocket(sock);
SSL_CTX_free(ctx);
WSACleanup();
system("pause");
return 0;
}
Соседние файлы в папке решения