Facendu a basa di dati dispunibile per a cunnessione remota

Cuminciamu cù u fattu chì ci sò casi quandu avete bisognu di fà una applicazione cù una cunnessione à una basa di dati. Questu hè fattu per ùn sfondà micca troppu in u sviluppu di backend è cuncentrazione in u frontend per mancanza di mani è cumpetenze. Ùn possu micca dì chì a mo suluzione serà sicura, ma funziona.

Siccomu ùn mi piace micca pagà per l'ospitu, aghju utilizatu a reta in u mo travagliu, ci hè una IP bianca. Eccu a so struttura:

Facendu a basa di dati dispunibile per a cunnessione remota

Aghju accessu à parechji computers, più precisamente 192.168.1.2 (aka 192.168.0.2) cù Linux installatu quì è 192.168.0.3 cù Windows. In generale, aghju sceltu mysql per a mo applicazione è hà guardatu ciò chì era dispunibule nantu à Linux. Era digià stallatu quì, ma nimu ùn sapi a password, è quelli chì sapianu scurdatu (quelli chì travagliavanu prima di mè). Dopu avè amparatu chì nimu hà bisognu, l'aghju sguassatu è pruvatu à stallà di novu. Ùn ci era micca abbastanza memoria, è postu chì per risolve stu errore avissi da cunnette un monitor è un teclatu cù un mouse, aghju decisu di rinunzià à sta materia. Inoltre, a macchina cù Windows hè assai più putente è più, l'aghju nantu à u mo laptop in casa. In principiu, ùn descriveraghju micca a stallazione stessa; ci sò assai manuali è video nantu à questu. Dopu avè installatu mysql in una macchina Windows, decisu di fà una copia di salvezza di e tavule da u mo laptop à a mo stazione di travagliu.

Hè fattu cusì (in u mo casu):

mysqldump -uroot -p your_base > dump_file.sql

Dopu, creemu una basa di dati in a nova basa di dati è restaurà a copia di salvezza nantu à a "nova" macchina.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


U schedariu di salvezza deve esse postu nantu à a nova macchina è, forsi, se micca in u cartulare cù l'utilità, allora u percorsu sanu à questu. (Aghju appena caricatu a copia di salvezza in GitHub è l'aghju clonatu nantu à una nova macchina). Aghju aghjustatu cumu si creanu e tavule stessu, ma ùn aghju micca salvatu i screenshots, è pensu chì ùn hè micca difficiule ancu per un studiente di l'annu 2-3.

Quandu tutti i tavulini sò stati restaurati, hè ora di rende l'accessu remotu à a basa di dati dispunibile. In generale, tali cumandamenti ùn anu micca purtatu à successu (dava solu permessu di lettura per selezziunà)

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

Più precisamente, puderia cunnette à a basa di dati solu cù u cumandimu,

mysql -h localhost -u client -pclient

ma questu ùn pudia più fà

mysql -h 192.168.0.3 -u client -pclient

Questu ùn hà micca travagliatu per mè è ùn pudia micca cunnette per questu indirizzu cum'è root.

U prugramma mysql workbench hà aiutatu; in i paràmetri, cambia u localhost à % è funziona, ancu se u cliente ùn hà micca aiutu. Avà pudete cunnette à a basa di dati da a cunsola o da u codice da qualsiasi indirizzu.

Facendu a basa di dati dispunibile per a cunnessione remota

Avete ancu bisognu di fà una rete di casa o di cummerciale è disattivà u firewall di Windows, altri ùn puderete mancu fà ping sta macchina (senza solu cunnette à a basa di dati).

A mità di u travagliu hè fattu, avà aghju bisognu di pudè cunnette à a basa di dati da casa.

Comu pudete vede da u diagramma di a rete, per ghjunghje à Internet avete bisognu di andà da 192.168.0.3 à 192.168.1.1 (router), andemu in a direzzione opposta. Cunfiguremu a strada da 192.168.1.1 à 192.168.1.2 cusì:

Facendu a basa di dati dispunibile per a cunnessione remota

In generale, l'imaghjini ùn si mostra micca, cusì scriveraghju a manu:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Questu pò esse fattu solu in una subnet, vale à dì, ùn pudete micca invià immediatamente à l'indirizzu 192.168.0.2 o 192.168.0.3.

Questu hè necessariu per chì u router sapi induve si trova a subnet 192.168.0.0/24 (amparate i principii di e rete hè utile).

Avà aghjunghjemu port forwarding 3306 (u portu predeterminatu di mysql (se ùn l'avete micca cambiatu durante a stallazione)) à l'indirizzu 192.168.1.2

Facendu a basa di dati dispunibile per a cunnessione remota

A cosa più difficiuli di fà hè di fà invià nantu à una macchina Linux (hà duie carte di rete 192.168.1.2 (interfaccia enp3s1) è 192.168.0.2 (interfaccia enp3s0) per chì e carte di rete sappianu ciò chì trasfiriri da 192.168.1.2. à 192.168.0.2, è dopu à a nostra macchina Windows cù 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

Quelli. A 1ª linea significa chì accettemu a prima cunnessione, a 2ª è a 3ª chì pudemu mandà pacchetti in e duie direzzione, a 4ª è a 5ª significa cambià l'indirizzi di destinazione è fonte. È voilà, pudete cunnette da casa via mysql. È infine, u mo codice C++ chì face questu:

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

Avà, pudete mandà in modu sicuru stu prugramma à qualcunu, è ùn avete micca bisognu di riscrive per fà u travagliu in u locu.

Source: www.habr.com

Add a comment