Zunächst einmal gibt es Situationen, in denen man eine Anwendung mit Datenbankanbindung erstellen muss. Das geschieht, um sich nicht mit der Backend-Entwicklung auseinandersetzen zu müssen und sich aufgrund von mangelnden Ressourcen und Fähigkeiten auf das Frontend zu konzentrieren. Ich kann nicht behaupten, dass meine Lösung sicher ist, aber sie funktioniert.
Da ich nicht gerne für und sogar, habe ich das Netzwerk an meinem Arbeitsplatz genutzt, dort gibt es eine öffentliche IP. Hier ist die Struktur:

Ich habe Zugriff auf mehrere Computer, genauer gesagt auf 192.168.1.2 (auch 192.168.0.2), wo Linux installiert ist, und auf 192.168.0.3 mit Windows. Für meine Anwendung habe ich MySQL ausgewählt und geschaut, was auf Linux verfügbar ist. Es war bereits installiert, aber das Passwort wusste niemand, und diejenigen, die es wussten, haben es vergessen (die, die vor mir dort gearbeitet haben). Als ich erfuhr, dass es niemandem mehr nützte, habe ich es gelöscht und versucht, es neu zu installieren. Der Speicher reichte nicht aus, und um diesen Fehler zu beheben, hätte ich einen Monitor sowie eine Tastatur und Maus anschließen müssen, also habe ich es aufgegeben. Zumal der Windows-Rechner viel leistungsfähiger ist und ich es auf meinem Heim-Laptop installiert habe. Ich werde die Installation selbst nicht beschreiben, es gibt zahlreiche Handbücher und Videos dazu. Nachdem ich MySQL auf der Windows-Maschine installiert hatte, beschloss ich, ein Backup der Tabellen vom Laptop auf die Workstation zu machen.
So funktioniert das (in meinem Fall):
mysqldump -uroot -p your_base > dump_file.sql
Dann erstellen wir in der neuen Datenbank eine Datenbank und stellen das Backup auf der „neuen“ Maschine wieder her.
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Die Backup-Datei muss auf die neue Maschine kopiert werden, und möglicherweise, wenn nicht im Verzeichnis mit dem Dienstprogramm, den vollständigen Pfad dazu. (Ich habe das Backup einfach auf GitHub hochgeladen und auf die neue Maschine geklont). Ich würde hinzufügen, wie die Tabellen erstellt werden, aber ich habe keine Screenshots gespeichert und denke, das ist für einen 2.-3. Kursstudenten nicht schwierig.
Nachdem ich alle Tabellen wiederhergestellt hatte, war es an der Zeit, den Remote-Zugriff auf die Datenbank möglich zu machen. Generell haben solche Befehle nicht zum Erfolg geführt (sie haben nur Lesezugriff für select gewährt).
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base.* to 'client'@'%';
flush privileges;
Genauer gesagt, konnte ich mich nur mit folgendem Befehl mit der Datenbank verbinden:
mysql -h localhost -u client -pclient
aber mit diesem konnte ich mich nicht verbinden:
mysql -h 192.168.0.3 -u client -pclient
das war für mich nicht geeignet, ich konnte mich auch nicht über diese Adresse und als root verbinden.
Das Programm MySQL Workbench hat mir geholfen, dort ändern Sie in den Einstellungen localhost auf % und es funktioniert, obwohl client das nicht geholfen hat. Jetzt können Sie sich von der Konsole oder aus dem Code von jeder Adresse aus mit der Datenbank verbinden.

Sie müssen auch das Netzwerk auf Zuhause oder Unternehmen einstellen und die Windows-Firewall ausschalten, sonst können Sie nicht einmal diese Maschine anpingen (geschweige denn sich mit der Datenbank zu verbinden).
Der halbe Weg ist gemacht, jetzt muss ich mich von zu Hause aus mit der Datenbank verbinden können.
Wie aus dem Netzwerkdiagramm ersichtlich ist, führt der Weg zum Internet von 192.168.0.3 bis 192.168.1.1 (Router). Lassen Sie uns rückwärts gehen. Wir konfigurieren die Route von 192.168.1.1 bis 192.168.1.2 so:

Im Allgemeinen zeigt das Bild nichts an — ich schreibe es von Hand:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Dies kann nur in einem Subnetz erfolgen, das heißt, man kann nicht direkt auf die Adressen 192.168.0.2 oder 192.168.0.3 zugreifen.
Dies ist notwendig, damit der Router weiß, wo sich das Subnetz 192.168.0.0/24 befindet (lernen Sie die Grundlagen von Netzwerken, das ist nützlich).
Jetzt fügen wir das Portforwarding für Port 3306 hinzu (Standardport für MySQL, es sei denn, Sie haben ihn bei der Installation geändert) auf die Adresse 192.168.1.2.

Jetzt bleibt die schwierigste Aufgabe: das Forwarding auf der Linux-Maschine zu konfigurieren (sie hat zwei Netzwerkkarten: 192.168.1.2 (Schnittstelle enp3s1) und 192.168.0.2 (Schnittstelle enp3s0)), damit die Netzwerkkarten wissen, dass sie von 192.168.1.2 auf 192.168.0.2 umgeleitet werden sollen, und dann auf unseren Windows-Rechner mit 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
und die letzte Zeile speichert die eingegebenen Befehle, damit sie beim Neustart des OS nicht gelöscht werden
sudo service iptables-persistent save
Das heißt, die erste Zeile bedeutet, dass wir die erste Verbindung akzeptieren, die zweite und dritte, dass Pakete in beide Richtungen durchgelassen werden, die vierte und fünfte bedeuten die Adressumsetzung des Ziels und der Quelle. Und voilà, man kann sich von zu Hause aus über MySQL verbinden. Und zum Schluss mein C++-Code, der das macht:
//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))
{
// Wenn keine Verbindung zu dem Server durch
// базы данных выводим сообщение об ошибке
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;
};
Jetzt kann man dieses Programm bedenkenlos jedem schicken, und es ist nicht nötig, es für die lokale Nutzung umzuschreiben.
Quelle: habr.com
