Alustame sellest, et on juhtumeid, kus on vaja luua rakendus, mis on ühendatud andmebaasiga. Seda tehakse selleks, et mitte süveneda tagaplaan arendusse ja keskenduda esiplaanile, kuna tööjõudu ja oskusi on vähe. Ma ei julge öelda, et minu lahendus on turvaline, kuid see töötab.
Kuna ma ei armasta maksta hõbustamise., kasutasin oma tööl olevat võrku, kus on valge IP. Siin on selle struktuur:

Mul on juurdepääs mitmele arvutile, täpsemalt 192.168.1.2 (samuti 192.168.0.2), kus on Linux, ja 192.168.0.3, kus on Windows. Kokkuvõttes valisin oma rakenduse jaoks MySQL ja uurisin, mis Linuxis olemas on. Seal oli juba installitud, kuid keegi ei teadnud parooli, ja need, kes teadis, on unustanud (need, kes töötasid enne mind). Uurides, et see ei ole kellelegi vajalik, kustutasin selle ja üritasin uuesti installida. Mälu ei piisavalt ja kuna selle vea parandamiseks oleks pidanud ühendama monitori ja klaviatuuri koos hiirega, otsustasin selle ettevõtmise lõpetada. Eriti kuna Windowsi masin on palju võimekam ja lisaks on mul endal see koduloodud sülearvutil. Üldiselt ei hakka ma installatsiooni kirjeldama, selle kohta on palju manuaale ja videoid. Pärast MySQL installimist Windowsi masinale otsustasin teha varukoopia tabeleid sülearvutist tööjaama.
Seda tehakse nii (minu puhul):
mysqldump -uroot -p your_base > dump_file.sql
Seejärel loome uues andmebaasis andmebaasi ja taastame varukoopia "uue" masina peal.
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Varak on teha uuele masinale ja kui mitte utiliidi kaustas, siis täielik tee selle juurde. (Ma lihtsalt laadisin varukoopia GitHubi ja kloonisin selle uuele masinale). Ma lisaksin, kuidas tabelid luuakse, kuid ei salvestanud ekraanipilte ja arvan, et see ei ole isegi 2-3 kursuse üliõpilasele keeruline.
Kui kõik tabelid olid taastatud, tuli aeg muuta andmebaasi kaugjuurdepääs kättesaadavaks. Üldiselt, sellised käsud ei viinud eduni (andis ainult lugemisõiguse select).
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
Täpsemalt sain andmebaasiga ühendust vaid käsuga,
mysql -h localhost -u client -pclient
aga sellega ei saanud enam ühendust,
mysql -h 192.168.0.3 -u client -pclient
see ei sobinud mulle, samuti ei saanud ühendust luua selle aadressi ja root kasutajaga.
Aitas programm mysql workbench, seal seadistustes muudan localhost % ja töötab, kuigi client ei aidanud. Nüüd saate andmebaasiga ühendust luua kas käsurealt või koodist igast aadressist.

Peale selle on vajalik teha võrk koduseks või ettevõtteks ja välja lülitada Windowsi tulemüür, vastasel juhul ei saa isegi sellele masinale pingutada (rääkimata andmebaasiga ühenduse loomisest).
Pool tööst on tehtud, järgmiseks peab mul olema võimalus kodust andmebaasiga ühendust luua.
Nagu näha on, et internetti pääsemiseks tuleb liikuda aadressilt 192.168.0.3 aadressile 192.168.1.1 (ruuter) ja nüüd minnes vastupidises suunas, seadistame marsruudi aadressilt 192.168.1.1 aadressile 192.168.1.2 järgnevalt:

Üldiselt, pilt ei näita — kirja panen käsitsi:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Seda saab teha ainult ühes alamvõrgus, see tähendab, et ei saa kohe suunata aadressile 192.168.0.2 või 192.168.0.3.
See on vajalik, et ruuter teaks, kus asub alamvõrk 192.168.0.0/24 (õppige võrguteooria aluseid, see on kasulik).
Nüüd lisame portide suunamise 3306 (mysql-port vaikimisi (kui te seda installimisel ei muutnud)) aadressile 192.168.1.2.

Nüüd jääb teha kõige keerulisem osa, see on edastamise seadistamine Linuxi masinas (seal on kaks võrkaartide aadressi 192.168.1.2 (liidese enp3s1) ja 192.168.0.2 (liidese enp3s0)), et võrkaartide juhtmed teaksid, kuidas edastada andmeid aadressilt 192.168.1.2 aadressile 192.168.0.2, ja sealt edasi meie Windows masinasse, kus on 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
ja viimane rida salvestab sisestatud käsud, et need ei kaoks operatsioonisüsteemi taaskäivitamisel
sudo service iptables-persistent save
Ehk siis esimene rida tähendab, et aktsepteerime esimestühendust, 2. ja 3. rida ütlevad, et pakette võib saata mõlemas suunas; 4. ja 5. rida tähistavad siht- ja allika adresseerimise vahetust. Ja voilà, nüüd saab kodust MySQL-iga ühendust luua. Ja lõpetuseks minu c++ kood, mis seda teeb:
//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); //Если используется оконное приложение
}
// Подключаемся к serverile
if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
{
// Kui ühendust ei õnnestu luua serveriga
// базы данных выводим сообщение об ошибке
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;
};
Nüüd võin julgelt seda programmi kellelegi edastada, ja ei pea seda ümber kirjutama, et see kohapeal töötaks.
Allikas: habr.com
