Fillimi do të jetë nga ajo se ka raste kur duhet për të bërë një aplikacion me lidhje në një bazë të dhënash. Kjo bëhet për të mos u marrë shumë me zhvillimin e bbackend-it dhe për t'u përqëndruar në frontend për shkak të mungesës së duarve dhe aftësive. Nuk e marr persiper të them se zgjidhja ime do të jetë e sigurt, por funksionon.
Sepse nuk më pëlqen të paguaj për hosting, unë shfrytëzova rrjetin në punë, aty kam një IP të bardhë. Këtu është struktura e saj:

Kam akses në disa kompjuterë, më saktësisht në 192.168.1.2 (po ashtu 192.168.0.2) ku është instaluar Linux dhe në 192.168.0.3 me Windows. Në të përgjithshme, për aplikacionin tim zgjodha mysql dhe kontrollova se çfarë ka në Linux. Aty ishte instaluar tashmë, por askush nuk e dinte fjalëkalimin, dhe ata që e dinin e kishin harruar (ata që punuan para meje). Pas mësimit se nuk i nevojitej askujt, e fshiva atë dhe u përpoqa ta instaloj përsëri. Nuk kishte mjaft memorie dhe pasi që për të korrigjuar këtë gabim do të duhej të lidhesha me të monitorin dhe tastierën me maus, vendosa ta lë këtë punë. Për më tepër, makina me Windows është shumë më e fuqishme dhe, plus, unë vetë e kam atë në laptopin tim shtëpiak. Në parim, nuk do ta përshkruaj instalimin, ka shumë manuale dhe video për këtë. Duke e instaluar mysql në makinën Windows, vendosa të bëj një backup të tabelave nga laptopi në stacionin e punës.
Kjo bëhet kështu (në rastin tim):
mysqldump -uroot -p your_base > dump_file.sql
Më pas në bazën e re krijojmë një bazë të dhënash dhe rikuperojmë backup-in në makinën "e re".
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
File me backup-in duhet ta vendosni në makinën e re dhe ndoshta, nëse nuk është në direktorinë me utilitarin, atëherë e gjithë ajo mundësia. (Thjesht e ngarkova backup-in në github dhe e klonova në makinën e re). Do ta kisha shtuar si krijohen tabelat, por nuk i mbajta skrinat, dhe mendoj se nuk është e komplikuar madje as për një student të vitit të dytë ose të tretë.
Kur rikuperova të gjitha tabelat, erdhi koha për të bërë të mundshme aksesin e largët në db. Në përgjithësi, komanda të tilla nuk sollën sukses (ndihmonin vetëm për të dhënë të drejtat për lexim select)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
Kjo do të thotë se mund të lidhesha në bazë vetëm me komandën,
mysql -h localhost -u client -pclient
ndërsa kështu nuk mund të lidhesha
mysql -h 192.168.0.3 -u client -pclient
për mua kjo nuk ishte e përshtatshme gjithashtu nuk mund të lidhesha përmes këtij adresi dhe nga root.
Programi mysql workbench ishte e dobishme, aty në konfigurim ndryshoni localhost në % dhe funksionon, megjithëse klienti nuk ndihmoi. Tani mund të lidheni me db nga konzola ose nga kodi nga çdo adresë.

Gjithashtu, duhet të krijoni një rrjet shtëpiak ose kompanie dhe të kërkoni të fikni bllokimin e Windows, përndryshe nuk do të mund të bëni as ping në këtë makinë (e lëre që të lidheni me db-në).
Gjysma e punës është bërë, tani duhet të mund të lidhem me bazën e të dhënave nga shtëpia.
Siç shihet nga skema e rrjetit, për në internet duhet të kaloni nga 192.168.0.3 në 192.168.1.1 (routeri) dhe do të shkojmë në kundër drejtim. Do të konfigurojmë rrugën nga 192.168.1.1 deri në 192.168.1.2 kështu:

Në përgjithësi, nuk po tregoj imazhin - do ta shkruaj me duar:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Kjo mund të bëhet vetëm në një nëndegë, domethënë nuk mund të kaloni menjëherë në adresën 192.168.0.2 ose 192.168.0.3.
Kjo është e nevojshme në mënyrë që routeri të dijë se ku gjendet nëndega 192.168.0.0/24 (mësoni bazat e rrjeteve, kjo është e dobishme).
Tani do të shtojmë portin 3306 (portin mysql sipas parazgjedhjes (nëse nuk e ndryshuat gjatë instalimit)) në adresën 192.168.1.2.

Tani mbetet të bëjmë gjënë më të vështirë, të realizojmë forwarding në makinën linux (në të ka dy kartela rrjeti 192.168.1.2 (interfaci enp3s1) dhe 192.168.0.2 (interfaci enp3s0), që kartelat e dinë se çfarë të kalojnë nga 192.168.1.2 në 192.168.0.2, dhe më pas në makinë tonë Windows me 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
dhe rreshti i fundit ruan komandat e futur që ato të mos fshihen gjatë rikthimit të sistemit.
Domethënë, rreshti i parë tregon se ne pranojmë lidhjen e parë, rreshtat e dytë dhe të tretë lejojnë që paketat të kalojnë në të dyja drejtimet, rreshtat e katërt dhe të pestë tregojnë zëvendësimin e adresave të destinacionit dhe burimit. Dhe ja, mund të lidheni nga shtëpia përmes mysql. Dhe për fund, kodi im në c++ që e bën këtë:
//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); //Если используется оконное приложение
}
// Подключаемся к serverit
if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
{
// Nëse nuk është e mundur të krijoni një lidhje me server
// базы данных выводим сообщение об ошибке
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;
};
Tani mund ta shpërndani këtë program të lirë për këdo, dhe nuk ka nevojë ta riprogramoni që të funksionojë lokal.
Burimi: habr.com
