Omogućavanje baze podataka za daljinsko povezivanje

Počnimo s činjenicom da postoje slučajevi kada trebate napraviti aplikaciju s vezom na bazu podataka. Ovo je učinjeno kako se ne bi previše upuštali u backend razvoj i koncentrirali se na frontend zbog nedostatka ruku i vještina. Ne mogu reći da će moje rješenje biti sigurno, ali funkcionira.

Pošto ne volim da plaćam hosting, koristio sam mrežu na poslu, tamo je bijeli IP. Evo njegove strukture:

Omogućavanje baze podataka za daljinsko povezivanje

Imam pristup nekoliko računara, tačnije 192.168.1.2 (aka 192.168.0.2) sa instaliranim Linuxom i 192.168.0.3 sa Windowsom. Generalno, izabrao sam mysql za svoju aplikaciju i pogledao šta je dostupno na Linuxu. Tamo je već bio instaliran, ali niko ne zna lozinku, a oni koji su znali zaboravili su (oni koji su radili prije mene). Saznavši da nikome nije potreban, obrisao sam ga i pokušao ponovo da ga instaliram. Nije bilo dovoljno memorije, a kako bih ispravio ovu grešku morao sam na nju spojiti monitor i tastaturu sa mišem, odlučio sam da odustanem od toga. Štaviše, mašina sa Windows-om je mnogo moćnija i plus, imam je na laptopu kod kuće. U principu, neću opisivati ​​samu instalaciju, postoji mnogo priručnika i video zapisa o tome. Nakon što sam instalirao mysql na Windows mašinu, odlučio sam da napravim rezervnu kopiju tabela sa svog laptopa na svoju radnu stanicu.

To se radi ovako (u mom slučaju):

mysqldump -uroot -p your_base > dump_file.sql

Zatim kreiramo bazu podataka u novoj bazi podataka i vraćamo rezervnu kopiju na „novu“ mašinu.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Datoteka sigurnosne kopije mora se postaviti na novi stroj i, možda, ako ne u direktorij s uslužnim programom, onda punu stazu do njega. (Upravo sam otpremio rezervnu kopiju na GitHub i klonirao je na novu mašinu). Dodao bih kako se prave tabele, ali nisam sačuvao screenshotove i mislim da to nije teško ni studentu 2-3 godine.

Kada su sve tabele vraćene, vreme je da omogućite daljinski pristup bazi podataka. Općenito, takve naredbe nisu dovele do uspjeha (dale su dozvolu samo za čitanje za odabir)

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

Tačnije, mogao sam da se povežem na bazu podataka samo komandom,

mysql -h localhost -u client -pclient

ali ovaj više nije mogao

mysql -h 192.168.0.3 -u client -pclient

Ovo mi nije uspjelo i nisam se mogao povezati preko ove adrese kao root.

Mysql workbench program je pomogao; u postavkama promijenite localhost u % i radi, iako klijent nije pomogao. Sada se možete povezati na bazu podataka sa konzole ili iz koda sa bilo koje adrese.

Omogućavanje baze podataka za daljinsko povezivanje

Također morate napraviti kućnu ili poslovnu mrežu i isključiti Windows firewall, inače nećete moći ni pingovati ovu mašinu (a kamoli da se povežete sa bazom podataka).

Pola posla je obavljeno, sada moram da se povežem na bazu podataka od kuće.

Kao što možete vidjeti iz mrežnog dijagrama, da biste došli do Interneta morate prijeći sa 192.168.0.3 na 192.168.1.1 (ruter), idemo u suprotnom smjeru. Konfigurirajmo rutu od 192.168.1.1 do 192.168.1.2 ovako:

Omogućavanje baze podataka za daljinsko povezivanje

Općenito, slika se ne vidi, pa ću je napisati rukom:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

To se može uraditi samo u jednoj podmreži, odnosno ne možete odmah proslijediti na adresu 192.168.0.2 ili 192.168.0.3

Ovo je neophodno kako bi ruter znao gde se nalazi podmreža 192.168.0.0/24 (učenje osnova mreža je korisno).

Sada dodajemo prosljeđivanje porta 3306 (podrazumevani mysql port (ako ga niste promijenili tokom instalacije)) na adresu 192.168.1.2

Omogućavanje baze podataka za daljinsko povezivanje

Najteže je preostalo prosljeđivanje na Linux mašini (ima dvije mrežne kartice 192.168.1.2 (enp3s1 interfejs) i 192.168.0.2 (enp3s0 interfejs) kako bi mrežne kartice znale šta da prenesu sa 192.168.1.2 na 192.168.0.2, a zatim na našu Windows mašinu sa 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

One. 1. red znači da prihvatamo prvu vezu, 2. i 3. da možemo slati pakete u oba smjera, 4. i 5. znači promjenu odredišne ​​i izvorne adrese. I voila, možete se povezati od kuće preko mysql-a. I konačno, moj C++ kod koji ovo radi:

//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;
};

Sada možete bezbedno poslati ovaj program bilo kome, i ne morate ga ponovo pisati da bi radio lokalno.

izvor: www.habr.com

Dodajte komentar