Laten we beginnen met het feit dat er situaties zijn waarin je een applicatie moet maken die verbinding maakt met een database. Dit wordt gedaan om niet te veel tijd te besteden aan backend-ontwikkeling en je te concentreren op de frontend vanwege een gebrek aan middelen en vaardigheden. Ik beweer niet dat mijn oplossing veilig zal zijn, maar hij werkt.
Aangezien ik niet graag betaald voor hosting, heb ik gebruik gemaakt van het netwerk op mijn werk, daar is een openbaar IP. Hier is de structuur:

Ik heb toegang tot verschillende computers, namelijk 192.168.1.2 (ook 192.168.0.2) waar Linux op draait, en 192.168.0.3 met Windows. Voor mijn applicatie heb ik mysql gekozen en gekeken wat er op Linux beschikbaar was. Het was daar al geïnstalleerd, maar niemand kende het wachtwoord en degenen die het wisten, waren het vergeten (degenen die voor mij werkten). Toen ik ontdekte dat het voor niemand nodig was, heb ik het verwijderd en geprobeerd het opnieuw te installeren. Het geheugen was niet genoeg en aangezien om deze fout op te lossen, ik een monitor en toetsenbord met muis moest aansluiten, besloot ik ermee te stoppen. Bovendien was de machine met Windows veel krachtiger en ik had er zelf één op mijn thuislaptop staan. In principe zal ik de installatie zelf niet beschrijven, er zijn tal van handleidingen en video's over. Nadat ik mysql op de Windows-machine had geïnstalleerd, besloot ik een back-up van de tabellen van mijn laptop naar de werkstation te maken.
Dit doe je als volgt (in mijn geval):
mysqldump -uroot -p your_base > dump_file.sql
Vervolgens maken we in de nieuwe database een database aan en herstellen we de back-up op de "nieuwe" machine.
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Het back-upbestand moet op de nieuwe machine worden geplaatst, en mogelijk de volledige pad als het niet in de directory met de utility staat. (Ik heb de back-up gewoon naar GitHub geüpload en deze op de nieuwe machine gekloond). Ik zou willen toevoegen hoe de tabellen zelf worden aangemaakt, maar ik heb de screenshots niet bewaard, en ik denk dat dit zelfs voor een tweede- of derdejaars student niet moeilijk is.
Toen ik alle tabellen had hersteld, was het tijd om de database beschikbaar te maken voor externe toegang. Over het algemeen leidde deze commando's niet tot succes (ze gaven alleen leesrechten voor select)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
Sterker nog, ik kon me alleen met de volgende commando aanmelden,
mysql -h localhost -u client -pclient
maar met die had ik geen toegang
mysql -h 192.168.0.3 -u client -pclient
ik kon me ook niet via dit adres en als root aanmelden.
De MySQL Workbench heeft geholpen; wijzig localhost naar % in de instellingen en het werkt, hoewel client dit niet hielp. Nu kun je verbinding maken met de database vanuit de console of vanuit de code vanaf elk adres.

Ook moet het netwerk als thuis of bedrijf worden ingesteld en de Windows-firewall worden uitgeschakeld, anders kun je deze machine zelfs niet pingen (laat staan verbinding maken met de database).
De helft van het werk is gedaan, nu moet ik vanuit huis verbinding kunnen maken met de database.
Zoals te zien is in het netwerkdiagram, moet je van 192.168.0.3 naar 192.168.1.1 (router) om bij het internet te komen. Laten we in omgekeerde volgorde gaan. We stellen het pad in van 192.168.1.1 naar 192.168.1.2 op de volgende manier:

In totaal toont de afbeelding niets - ik schrijf het met de hand:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Dit kan alleen binnen één subnet worden gedaan, dat wil zeggen dat je niet onmiddellijk kunt doorsturen naar het adres 192.168.0.2 of 192.168.0.3.
Dit is nodig zodat de router weet waar het subnet 192.168.0.0/24 zich bevindt (leer de basisprincipes van netwerken, dat is nuttig).
Nu voegen we de poortdoorgifte 3306 toe (de standaardpoort voor MySQL (tenzij je deze tijdens de installatie hebt gewijzigd)) naar het adres 192.168.1.2.

Het enige wat nog moet worden gedaan, is het doorsturen op de Linux-machine (waarop twee netwerkkaarten zitten: 192.168.1.2 (interface enp3s1) en 192.168.0.2 (interface enp3s0)), zodat de netwerkkaarten weten dat ze moeten doorsturen van 192.168.1.2 naar 192.168.0.2, en dan naar onze Windows-machine met 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
en de laatste regel slaat de ingevoerde commando's op, zodat ze niet verdwijnen bij het herstarten van het besturingssysteem
sudo service iptables-persistent save
Dus, de eerste regel betekent dat we de eerste verbinding accepteren, de tweede en derde dat we pakketten in beide richtingen mogen doorlaten, de vierde en vijfde dat we het bestemmings- en brondadres vervangen. En voilà, je kunt verbinden vanuit huis via MySQL. En tot slot, mijn C++-code die dit doet:
//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))
{
// Als het niet mogelijk is om verbinding te maken met 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;
};
Nu kun je dit programma gerust aan iedereen geven, en het hoeft niet herschreven te worden zodat het lokaal werkt.
Bron: habr.com
