Commençons par le fait qu'il existe des cas où il est nécessaire de créer une application avec une connexion à une base de données. Cela est réalisé afin de ne pas se perdre dans le développement backend et de se concentrer sur le frontend en raison d'un manque de ressources et de compétences. Je ne prétends pas que ma solution sera sécurisée, mais elle fonctionne.
Puisque je n'aime pas payer pour . C'est très pratique d'avoir tout au même endroit. Grâce à cela, en cas de problème, nos spécialistes vous aideront à le résoudre dans les plus brefs délais., j'ai utilisé le réseau de mon travail, où il y a une IP publique. Voici sa structure :

J'ai accès à plusieurs ordinateurs, en particulier à 192.168.1.2 (également 192.168.0.2) qui fonctionne sous Linux, et à 192.168.0.3 avec Windows. En gros, pour mon application, j'ai choisi MySQL et j'ai vu ce qu'il y avait sur Linux. Il y était déjà installé, mais personne ne connaît le mot de passe, et ceux qui le savaient ont oublié (ceux qui ont travaillé avant moi). En découvrant qu'il n'était nécessaire à personne, je l'ai désinstallé et j'ai essayé de le réinstaller. La mémoire manquait et comme pour corriger cette erreur, il aurait fallu connecter un moniteur, un clavier et une souris, j'ai décidé d'abandonner. D'autant plus que la machine Windows est beaucoup plus puissante et en plus, j'en ai déjà une sur mon ordinateur portable personnel. En gros, je ne vais pas décrire l'installation elle-même, il existe des tonnes de manuels et de vidéos à ce sujet. Après avoir installé MySQL sur la machine Windows, j'ai décidé de faire une sauvegarde des tables de l'ordinateur portable vers la station de travail.
Voici comment procéder (dans mon cas) :
mysqldump -uroot -p your_base > dump_file.sql
Ensuite, dans la nouvelle base de données, nous créons la base de données et restaurons la sauvegarde sur la « nouvelle » machine.
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Le fichier de sauvegarde doit être placé sur la nouvelle machine et éventuellement, si ce n'est pas dans le répertoire avec l'utilitaire, le chemin complet vers celui-ci. (J'ai simplement mis la sauvegarde sur GitHub et je l'ai clonée sur la nouvelle machine). J'aurais ajouté comment créer les tables, mais je n'ai pas sauvegardé les captures d'écran, et je pense que ce n'est pas difficile même pour un étudiant de 2e ou 3e année.
Une fois toutes les tables restaurées, il était temps de rendre l'accès distant à la base de données. En gros, ces commandes n'ont pas réussi (elles n'ont donné que le droit de lecture select)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
En fait, je pouvais me connecter à la base de données uniquement avec la commande,
mysql -h localhost -u client -pclient
mais celle-ci ne fonctionnait pas
mysql -h 192.168.0.3 -u client -pclient
cela ne me convenait pas non plus, et je ne pouvais pas me connecter par cette adresse avec root.
Le programme mysql workbench m'a aidé, il suffit de changer localhost en % dans les paramètres et ça fonctionne, même si le client ça n'a pas aidé. Vous pouvez maintenant vous connecter à la base de données depuis la console ou le code depuis n'importe quelle adresse.

Il faut également créer un réseau domestique ou d'entreprise et désactiver le pare-feu Windows, sinon vous ne pourrez même pas faire un ping sur cette machine (encore moins vous connecter à la base de données).
Une partie du travail est fait, il reste à me permettre de me connecter à la base de données depuis chez moi.
Comme on le voit sur le schéma du réseau, il faut passer par le chemin de 192.168.0.3 à 192.168.1.1 (routeur), allons dans l'autre sens. Configurons la route de 192.168.1.1 à 192.168.1.2 de cette manière :

En gros, je ne montre pas l'image — je vais l'écrire à la main :
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Cela ne peut être fait que dans un seul sous-réseau, donc il n'est pas possible de rediriger directement vers l'adresse 192.168.0.2 ou 192.168.0.3.
Cela est nécessaire pour que le routeur sache où se trouve le sous-réseau 192.168.0.0/24 (apprenez les bases des réseaux, c'est utile).
Nous ajoutons maintenant le transfert du port 3306 (port mysql par défaut (à condition que vous ne l'ayez pas changé lors de l'installation)) à l'adresse 192.168.1.2.

Il reste maintenant à faire la partie la plus compliquée, c'est-à-dire configurer le transfert sur la machine Linux (qui a deux cartes réseau, 192.168.1.2 (interface enp3s1) et 192.168.0.2 (interface enp3s0)), pour que les cartes réseau sachent qu'il faut transférer de 192.168.1.2 à 192.168.0.2, puis à notre machine Windows avec 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
et la dernière ligne enregistre les commandes saisies pour qu'elles ne soient pas perdues au redémarrage du système
sudo service iptables-persistent save
C'est-à-dire que la première ligne signifie que nous acceptons la première connexion, les deuxième et troisième lignes signifient que des paquets peuvent être envoyés dans les deux sens, la quatrième et la cinquième signifient la substitution d'adresse de destination et d'origine. Et voilà, vous pouvez vous connecter depuis chez vous via mysql. Et pour finir, voici mon code en c++ qui le fait :
//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); //Если используется оконное приложение
}
// Подключаемся к serveur
if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
{
// Si la connexion ne peut pas être établie avec serveur
// базы данных выводим сообщение об ошибке
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;
};
Vous pouvez maintenant tranquillou partager ce programme avec n'importe qui, sans avoir besoin de le modifier pour qu'il fonctionne localement.
Source : habr.com
