Pradėkime nuo to, kad yra atvejų, kai reikia sukurti programą su ryšiu su duomenų baze. Tai daroma siekiant per daug nesigilinti į backend kūrimą ir susikoncentruoti ties frontend dėl rankų ir įgūdžių stokos. Negaliu pasakyti, kad mano sprendimas bus saugus, bet jis veikia.
Nes nemėgstu mokėti prieglobaAš naudojau tinklą savo darbe, kuris turi viešą IP adresą. Štai jo struktūra:

У меня имеется доступ к нескольким компьютерам точнее к 192.168.1.2 (он же 192.168.0.2) там стоит Linux и к 192.168.0.3 с Windows. В общем, для своего приложения я выбрал mysql и посмотрел что есть на Linux. Там уже был установлен он, но пароль никто не знает, а те кто знали забыли (те кто работал до меня). Узнав что он никому не нужен, я его удалил и попытался установить заново. Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью, я решил бросить это дело. Тем более что машина с Windows куда мощней и плюс ко всему у меня у самого стоит она на ноутбуке домашнем. В принципе саму установку я описывать не буду, есть куча мануалов и видео про это. Установив mysql на Windows машину, я решил сделать бэкап таблиц с ноутбука на рабочую станцию.
Tai daroma taip (mano atveju):
mysqldump -uroot -p your_base > dump_file.sql
Tada sukuriame duomenų bazę naujoje duomenų bazėje ir atkuriame atsarginę kopiją „naujame“ kompiuteryje.
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Atsarginės kopijos failas turi būti patalpintas naujame kompiuteryje ir, galbūt, jei ne kataloge su programa, tada visas kelias į jį. (Aš ką tik įkėliau atsarginę kopiją į „GitHub“ ir klonavau ją į naują įrenginį). Pridurčiau, kaip kuriamos pačios lentelės, bet ekrano kopijų neišsaugojau, ir manau, kad tai nėra sunku net 2-3 metų studentui.
Kai visos lentelės bus atkurtos, laikas padaryti nuotolinę prieigą prie duomenų bazės. Apskritai tokios komandos nepasiekė sėkmės (suteikė tik skaitymo leidimą pasirinkti)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
Tiksliau, prie duomenų bazės galėjau prisijungti tik su komanda,
mysql -h localhost -u client -pclient
bet šis to nebegalėjo
mysql -h 192.168.0.3 -u client -pclient
Tai man neveikė ir negalėjau prisijungti per šį adresą kaip root.
Padėjo mysql workbench programa, nustatymuose pakeiti localhost į % ir veikia, nors klientas nepadėjo. Dabar galite prisijungti prie duomenų bazės iš konsolės arba naudodami kodą iš bet kurio adreso.

Еще нужно сделать сеть домашней или предприятия и выключить брандмауэр Windows иначе не сможете даже сделать пинг этой машины(не то чтобы подключится к бд).
Pusė darbo atlikta, dabar turiu turėti galimybę prisijungti prie duomenų bazės iš namų.
Kaip matote iš tinklo schemos, norint patekti į internetą, reikia pereiti nuo 192.168.0.3 iki 192.168.1.1 (maršrutizatorius), eikime priešinga kryptimi. Sukonfigūruokime maršrutą nuo 192.168.1.1 iki 192.168.1.2 taip:

Apskritai paveikslėlis nerodomas, todėl parašysiu ranka:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Tai galima padaryti tik viename potinklyje, ty negalite iš karto persiųsti adresu 192.168.0.2 arba 192.168.0.3
Tai būtina, kad maršrutizatorius žinotų, kur yra 192.168.0.0/24 potinklis (pramoka išmokti tinklų pagrindus).
Dabar prie adreso 3306 pridedame prievado persiuntimą 192.168.1.2 (numatytasis mysql prievadas (jei jo nepakeitėte diegdami)

Вот осталось сделать самое сложное это сделать форвардинг на линукс машине(на ней две сетевые карточки 192.168.1.2 (интерфейс enp3s1) и 192.168.0.2(интерфейс enp3s0) чтобы сетевухи знали что перебросить их с 192.168.1.2 на 192.168.0.2, а потом на нашу Windows машину с 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
и последняя строчка сохраняет введенные команды чтобы они при перезапуске оси не стерлись
sudo service iptables-persistent save
Tie. 1-oji eilutė reiškia, kad priimame pirmąjį ryšį, 2-oji ir 3-oji, kad galime siųsti paketus abiem kryptimis, 4-oji ir 5-oji reiškia paskirties ir šaltinio adresų keitimą. Ir voila, galite prisijungti iš namų per mysql. Ir galiausiai, mano C++ kodas, kuris tai daro:
//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); //Если используется оконное приложение
}
// Подключаемся к серверу
if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
{
// Если нет возможности установить соединение с сервером
// базы данных выводим сообщение об ошибке
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;
};
Dabar galite saugiai siųsti šią programą bet kam ir jums nereikia jos perrašyti, kad ji veiktų vietoje.
Šaltinis: www.habr.com
