Lad os starte med, at der er situationer, hvor man skal lave et program, der connecter til en database. Dette gøres for ikke at skulle rode for meget med backend-udvikling og fokusere på frontend på grund af mangel på ressourcer og færdigheder. Jeg vil ikke påstå, at min løsning vil være sikker, men den fungerer.
Da jeg ikke bryder mig om at betale for hosting, benyttede jeg mig af netværket på mit arbejde, hvor der er en offentlig IP. Dens struktur er følgende:

Jeg har adgang til flere computere, præcist til 192.168.1.2 (som også er 192.168.0.2); der kører Linux, og til 192.168.0.3 med Windows. For mit program valgte jeg mysql og tjekkede, hvad der var på Linux. Den var allerede installeret, men ingen kendte adgangskoden, og dem der vidste det, havde glemt det (dem der arbejdede før mig). Da jeg fandt ud af, at den ikke var nødvendig for nogen, slettede jeg den og forsøgte at installere den igen. Der var ikke nok plads, og eftersom det ville kræve, at jeg tilsluttede en skærm, tastatur og mus for at rette denne fejl, besluttede jeg mig for at give op. Desuden er maskinen med Windows meget mere kraftfuld, og jeg har også en selv på min bærbare computer. Jeg vil egentlig ikke beskrive selve installationen, der findes masser af manualer og videoer om det. Efter at have installeret mysql på Windows-maskinen, besluttede jeg at lave en backup af tabellerne fra den bærbare computer til arbejdsstationen.
Det gøres på følgende måde (i mit tilfælde):
mysqldump -uroot -p your_base > dump_file.sql
Derefter opretter vi en database i den nye database og gendanner backup’en på den "nye" maskine.
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Backup-filen skal placeres på den nye maskine, og muligvis, hvis den ikke er i mappen med værktøjet, så hele stien til den. (Jeg uploadede bare backup’en til GitHub og klonede den til den nye maskine). Jeg ville have tilføjet, hvordan tabellerne oprettes, men jeg har ikke gemt skærmbillederne, og jeg mener, det ikke er svært, selv for en 2.-3. års studerende.
Når jeg havde gendannet alle tabellerne, var det tid til at gøre fjernadgang til databasen muligt. Generelt førte sådanne kommandoer ikke til succes (de gav kun læserettigheder til select)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base .* to 'client'@'%';
flush privileges;
Egentlig kunne jeg kun forbinde til databasen med kommandoen,
mysql -h localhost -u client -pclient
men den kunne jeg ikke bruge
mysql -h 192.168.0.3 -u client -pclient
det passede mig ikke, og jeg kunne heller ikke forbinde via denne adresse som root.
Programmet mysql workbench hjalp; i indstillingerne ændrer du localhost til % og det fungerer, selvom klienten ikke hjalp. Nu kan du forbinde til databasen fra konsollen eller fra koden fra hvilken som helst adresse.

Det er også nødvendigt at lave et hjemmenetværk eller et virksomhedsnetsværk og slå Windows-firewallen fra, ellers kan du ikke engang pinge denne maskine (endda ikke forbinde til databasen).
Halvdelen af arbejdet er gjort; det næste skridt er, at jeg skal kunne forbinde til databasen hjemmefra.
Som det fremgår af netværksdiagrammet, skal man gå vejen fra 192.168.0.3 til 192.168.1.1 (router) og derefter gå baglæns. Lad os opsætte ruten fra 192.168.1.1 til 192.168.1.2 på denne måde:

Generelt viser billedet ikke — jeg skriver det i hånden:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Dette kan kun gøres i samme subnet, det vil sige, at man ikke med det samme kan videresende til adressen 192.168.0.2 eller 192.168.0.3.
Dette er nødvendigt, så routeren ved, hvor subnettet 192.168.0.0/24 ligger (lær grundlæggende netværk; det er nyttigt).
Nu tilføjer vi port forwarding til port 3306 (standardport for mysql (medmindre du har ændret det ved installationen)) til adressen 192.168.1.2.

Det sværeste tilbage er at opsætte forwarding på linux-maskinen (den har to netværkskort, 192.168.1.2 (interface enp3s1) og 192.168.0.2 (interface enp3s0), så netværkskortene ved, hvad de skal videresende fra 192.168.1.2 til 192.168.0.2, og derefter til vores Windows-maskine med 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
og den sidste linje gemmer de indtastede kommandoer, så de ikke bliver slettet ved genstart af systemet.
sudo service iptables-persistent save
Så den første linje betyder, at vi accepterer den første forbindelse, den anden og tredje betyder, at pakker kan sendes i begge retninger, og den fjerde og femte linje står for udskiftningen af destinations- og kildesignalerne. Og voilà, man kan forbinde hjemmefra via mysql. Og til sidst min kode i c++, der gør dette:
//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); //Если используется оконное приложение
}
// Подключаемся к server
if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
{
// Hvis forbindelsen ikke kan oprettes med serveren
// базы данных выводим сообщение об ошибке
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;
};
Nu kan jeg trygt dele dette program med alle, og det er ikke nødvendigt at omskrive det for at få det til at køre lokalt.
Kilde: habr.com
