Да започнем с факта, че има случаи, когато трябва да направите приложение с връзка към база данни. Това се прави, за да не се задълбочава твърде много в backend разработката и да се концентрира върху frontend поради липса на ръце и умения. Не мога да кажа, че моето решение ще е безопасно, но работи.
Тъй като не обичам да плащам за хостинг, използвах мрежата на работа, там има бял IP. Ето структурата му:
Имам достъп до няколко компютъра, по-точно 192.168.1.2 (известен още като 192.168.0.2) с инсталиран Linux там и 192.168.0.3 с Windows. Като цяло избрах mysql за моето приложение и погледнах какво има в Linux. Вече беше инсталиран там, но никой не знае паролата, а тези, които знаеха, забравиха (тези, които работеха преди мен). След като научих, че никой не се нуждае от него, го изтрих и се опитах да го инсталирам отново. Нямаше достатъчно памет и тъй като за да поправя тази грешка, трябваше да свържа към него монитор и клавиатура с мишка, реших да се откажа от този въпрос. Освен това машината с Windows е много по-мощна и плюс, имам я на лаптопа си вкъщи. По принцип няма да описвам самата инсталация, има много ръководства и видеоклипове за това. След като инсталирах mysql на машина с Windows, реших да архивирам таблиците от моя лаптоп на моята работна станция.
Това се прави така (в моя случай):
mysqldump -uroot -p your_base > dump_file.sql
След това създаваме база данни в новата база данни и възстановяваме архива на „новата“ машина.
mysql -h localhost -u root -p
create database your_base;
use your_base;
mysql -uroot -p your_base < dump_file.sql
show tables;
Архивният файл трябва да бъде поставен на новата машина и може би, ако не в директорията с помощната програма, тогава пълният път до нея. (Току-що качих резервното копие в GitHub и го клонирах на нова машина). Бих добавил как се създават самите таблици, но не запазих екранните снимки и мисля, че не е трудно дори за ученик от 2-3 години.
Когато всички таблици са възстановени, е време да направите отдалечен достъп до базата данни. Като цяло такива команди не доведоха до успех (дадоха само разрешение за четене за избор)
create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;
По-точно, можех да се свържа с базата данни само с командата,
mysql -h localhost -u client -pclient
но този не можеше да го направи повече
mysql -h 192.168.0.3 -u client -pclient
Това не работи за мен и не можах да се свържа през този адрес като root.
Програмата mysql workbench помогна; в настройките променете localhost на % и работи, въпреки че клиентът не помогна. Сега можете да се свържете с базата данни от конзолата или от код от всеки адрес.
Трябва също така да създадете домашна или бизнес мрежа и да изключите защитната стена на Windows, в противен случай дори няма да можете да пингвате тази машина (да не говорим за връзка с базата данни).
Половината работа е свършена, сега трябва да мога да се свържа с базата данни от вкъщи.
Както можете да видите от диаграмата на мрежата, за да стигнете до интернет, трябва да преминете от 192.168.0.3 до 192.168.1.1 (рутер), нека да отидем в обратната посока. Нека конфигурираме маршрута от 192.168.1.1 до 192.168.1.2 по следния начин:
Като цяло снимката не се показва, така че ще я напиша на ръка:
route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2
Това може да се направи само в една подмрежа, тоест не можете незабавно да пренасочите към адрес 192.168.0.2 или 192.168.0.3
Това е необходимо, така че рутерът да знае къде се намира подмрежата 192.168.0.0/24 (изучаването на основите на мрежите е полезно).
Сега добавяме пренасочване на порт 3306 (портът на mysql по подразбиране (ако не сте го променили по време на инсталацията)) към адреса 192.168.1.2
Най-трудното нещо, което остава да направите, е да направите пренасочване на машина с Linux (има две мрежови карти 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
Тези. 1-ви ред означава, че приемаме първата връзка, 2-ри и 3-ти, че можем да изпращаме пакети в двете посоки, 4-ти и 5-ти означават промяна на адреса на местоназначението и източника. И готово, можете да се свържете от вкъщи чрез mysql. И накрая, моят C++ код, който прави това:
//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;
};
Сега можете безопасно да изпратите тази програма на всеки и не е нужно да я пренаписвате, за да работи локално.
Източник: www.habr.com