Ставање на базата на податоци достапна за далечинско поврзување

Да почнеме со фактот дека има случаи кога треба да направите апликација со поврзување со база на податоци. Ова е направено за да не се навлегува премногу во развојот на задниот дел и да не се концентрира на предниот дел поради недостаток на раце и вештини. Не можам да кажам дека моето решение ќе биде безбедно, но функционира.

Бидејќи не сакам да плаќам за хостинг, ја користев мрежата на работа, таму има бела IP адреса. Еве ја нејзината структура:

Ставање на базата на податоци достапна за далечинско поврзување

Имам пристап до неколку компјутери, поточно 192.168.1.2 (ака 192.168.0.2) со инсталиран Linux таму и 192.168.0.3 со Windows. Во принцип, избрав mysql за мојата апликација и погледнав што беше достапно на Linux. Веќе беше инсталиран таму, но никој не ја знае лозинката, а тие што знаеја заборавија (оние што работеа пред мене). Откако дознав дека никому не му треба, го избришав и се обидов повторно да го инсталирам. Немаше доволно меморија, и бидејќи за да ја поправам оваа грешка ќе треба да поврзам монитор и тастатура со глувче, решив да се откажам од ова прашање. Згора на тоа, машината со Windows е многу помоќна и плус, ја имам на мојот лаптоп дома. Во принцип, нема да ја опишам самата инсталација; има многу прирачници и видеа за тоа. Откако инсталирав mysql на машина со Windows, решив да направам резервна копија на табелите од мојот лаптоп до мојата работна станица.

Тоа е направено вака (во мојот случај):

mysqldump -uroot -p your_base > dump_file.sql

Следно, создаваме база на податоци во новата база на податоци и ја враќаме резервната копија на „новата“ машина.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Резервната датотека мора да биде поставена на новата машина и, можеби, ако не во директориумот со алатката, тогаш целосната патека до неа. (Само што ја подигнав резервната копија на GitHub и ја клонирав на нова машина). Би додал како се креираат самите табели, но не ги зачував сликите од екранот и мислам дека не е тешко дури и за студент од 2-3 години.

Кога сите табели се обновени, време е да се направи далечински пристап до базата на податоци достапен. Во принцип, таквите команди не доведоа до успех (даде само дозвола за читање за избор)

create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;

Поточно, можев да се поврзам со базата само со командата,

mysql -h localhost -u client -pclient

но овој веќе не можеше

mysql -h 192.168.0.3 -u client -pclient

Ова не функционираше за мене и не можев да се поврзам преку оваа адреса како root.

Помогна програмата mysql workbench; во поставките, сменете го localhost во % и работи, иако клиентот не помогна. Сега можете да се поврзете со базата на податоци од конзолата или од код од која било адреса.

Ставање на базата на податоци достапна за далечинско поврзување

Исто така, треба да направите домашна или деловна мрежа и да го исклучите заштитниот ѕид на Windows, инаку нема да можете ни да ја пингувате оваа машина (а камоли да се поврзете со базата на податоци).

Пола работа е завршена, сега треба да можам да се поврзам со базата од дома.

Како што можете да видите од мрежниот дијаграм, за да стигнете до Интернет треба да отидете од 192.168.0.3 на 192.168.1.1 (рутер), ајде да одиме во спротивна насока. Ајде да ја конфигурираме рутата од 192.168.1.1 до 192.168.1.2 вака:

Ставање на базата на податоци достапна за далечинско поврзување

Во принцип, сликата не се прикажува, па ќе ја напишам рачно:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Ова може да се направи само во една подмрежа, односно не можете веднаш да препратите на адресата 192.168.0.2 или 192.168.0.3

Ова е неопходно за рутерот да знае каде се наоѓа подмрежата 192.168.0.0/24 (корисно е учењето на основите на мрежите).

Сега додаваме препраќање порти 3306 (стандардна порта за mysql (ако не сте ја смениле при инсталацијата)) на адресата 192.168.1.2

Ставање на базата на податоци достапна за далечинско поврзување

Најтешкото нешто што треба да направите е да направите препраќање на машина Линукс (има две мрежни картички 192.168.1.2 (интерфејс enp3s1) и 192.168.0.2 (интерфејс enp3s0), така што мрежните картички знаат што да ги префрлат од 192.168.1.2 на 192.168.0.2, а потоа на нашата Windows машина со MySql.

sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -p tcp --syn --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i enp3s0 -o enp3s1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i enp3s1 -p tcp --dport 3306 -j DNAT --to-destination 192.168.0.3
sudo iptables -t nat -A POSTROUTING -o enp3s0 -p tcp --dport 3306 -d 192.168.0.3 -j SNAT --to-source 192.168.1.2
и последняя строчка сохраняет введенные команды чтобы они при перезапуске оси не стерлись
sudo service iptables-persistent save

Оние. Првата линија значи дека ја прифаќаме првата врска, втората и третата дека можеме да испраќаме пакети во двете насоки, 1-та и 2-та значи промена на дестинацијата и адресите на изворот. И voila, можете да се поврзете од дома преку mysql. И, конечно, мојот C++ код што го прави ова:

//DataBaseConnection.cpp
#include "DataBaseConnection.h"

DataBaseConnection::DataBaseConnection()
{
}
void DataBaseConnection::Connect()
{
	// Получаем дескриптор соединения
	conn = mysql_init(NULL);
	if (conn == NULL)
	{
		// Если дескриптор не получен – выводим сообщение об ошибке
		fprintf(stderr, "Error: can'tcreate MySQL-descriptorn");
		//exit(1); //Если используется оконное приложение
	}
	// Подключаемся к серверу
	if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
	{
		// Если нет возможности установить соединение с сервером 
		// базы данных выводим сообщение об ошибке
		fprintf(stderr, "Error: can't connect to database: %sn", mysql_error(conn));
	}
	else
	{
		// Если соединение успешно установлено выводим фразу - "Success!"
		fprintf(stdout, "Success!n");
	}
}
std::vector<std::string> DataBaseConnection::Query()
{
	vectordrum.clear();
	std::string query = "SELECT * FROM drum where id=0";
	const char * q = query.c_str();
	qstate = mysql_query(conn, q);
	if (!qstate)
	{
		res = mysql_store_result(conn);
		while (row = mysql_fetch_row(res))
		{
			//printf("ID: %s,Position: %s, Image: %sn", row[0], row[1], row[2]);
			vectordrum.push_back(row[2]);
		}
	}
	else
	{
		std::cout << "Query failed:" << mysql_error(conn) << std::endl;
	}
	return vectordrum;
}
void DataBaseConnection::Close()
{
	// Закрываем соединение с сервером базы данных
	mysql_close(conn);
}
DataBaseConnection::~DataBaseConnection()
{
	vectordrum.clear();
}
//DataBaseConnection.h
#pragma once
#include <iostream>
#include <mysql.h>
#include <vector>
#pragma comment(lib,"mysqlcppconn.lib")
#pragma comment(lib,"libmysql.lib")
class DataBaseConnection
{
public:
	DataBaseConnection();
	void Connect();
	std::vector<std::string> Query();
	void Close();
	~DataBaseConnection();
	MYSQL *conn;
	MYSQL_ROW row;
	MYSQL_RES *res;
	int qstate;
	std::vector<std::string> vectordrum;
};

Сега можете безбедно да ја испратите оваа програма на секого и не мора да ја препишувате за да може да работи локално.

Извор: www.habr.com

Додадете коментар