Ginagawang available ang database para sa malayuang koneksyon

Magsimula tayo sa katotohanan na may mga kaso kung kailan kailangan mong gumawa ng isang application na may koneksyon sa isang database. Ginagawa ito upang hindi masyadong malalim ang pag-develop sa backend at mag-concentrate sa frontend dahil sa kakulangan ng mga kamay at kasanayan. Hindi ko masasabi na magiging ligtas ang aking solusyon, ngunit gumagana ito.

Dahil hindi ako mahilig magbayad ng hosting, ginamit ko ang network sa aking trabaho, may puting IP doon. Narito ang istraktura nito:

Ginagawang available ang database para sa malayuang koneksyon

Mayroon akong access sa ilang mga computer, mas tiyak na 192.168.1.2 (aka 192.168.0.2) na may naka-install na Linux doon at 192.168.0.3 na may Windows. Sa pangkalahatan, pinili ko ang mysql para sa aking aplikasyon at tiningnan kung ano ang magagamit sa Linux. Naka-install na ito doon, ngunit walang nakakaalam ng password, at ang mga nakakaalam ay nakalimutan (mga taong nagtrabaho bago ako). Nang malaman ko na walang nangangailangan nito, tinanggal ko ito at sinubukang i-install muli. Walang sapat na memorya, at dahil upang ayusin ang error na ito, kailangan kong ikonekta ang isang monitor at keyboard na may mouse dito, nagpasya akong sumuko sa bagay na ito. Bukod dito, ang makina na may Windows ay mas malakas at dagdag pa, mayroon ako nito sa aking laptop sa bahay. Sa prinsipyo, hindi ko ilalarawan ang mismong pag-install; mayroong maraming mga manual at video tungkol dito. Ang pagkakaroon ng pag-install ng mysql sa isang Windows machine, nagpasya akong i-backup ang mga talahanayan mula sa aking laptop sa aking workstation.

Ito ay tapos na tulad nito (sa aking kaso):

mysqldump -uroot -p your_base > dump_file.sql

Susunod, lumikha kami ng isang database sa bagong database at ibalik ang backup sa "bagong" machine.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Ang backup na file ay dapat ilagay sa bagong makina at, marahil, kung hindi sa direktoryo na may utility, pagkatapos ay ang buong landas patungo dito. (Na-upload ko lang ang backup sa GitHub at na-clone ito sa isang bagong makina). Idadagdag ko kung paano nilikha ang mga talahanayan mismo, ngunit hindi ko nai-save ang mga screenshot, at sa palagay ko hindi ito mahirap kahit para sa isang 2-3 taong mag-aaral.

Kapag naibalik na ang lahat ng mga talahanayan, oras na para gawing available ang malayuang pag-access sa database. Sa pangkalahatan, ang mga naturang utos ay hindi humantong sa tagumpay (nagbigay lamang ito ng pahintulot sa pagbasa upang pumili)

create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;

Mas tiyak, maaari akong kumonekta sa database lamang gamit ang utos,

mysql -h localhost -u client -pclient

ngunit hindi na ito magagawa ng isang ito

mysql -h 192.168.0.3 -u client -pclient

Hindi ito gumana para sa akin at hindi ako makakonekta sa address na ito bilang root.

Nakatulong ang mysql workbench program; sa mga setting, baguhin ang localhost sa % at ito ay gumagana, kahit na ang kliyente ay hindi tumulong. Ngayon ay maaari kang kumonekta sa database mula sa console o mula sa code mula sa anumang address.

Ginagawang available ang database para sa malayuang koneksyon

Kailangan mo ring gumawa ng network ng bahay o negosyo at i-off ang Windows firewall, kung hindi, hindi mo rin magagawang i-ping ang makina na ito (pabayaan na lamang na kumonekta sa database).

Ang kalahati ng trabaho ay tapos na, ngayon kailangan kong makakonekta sa database mula sa bahay.

Tulad ng nakikita mo mula sa diagram ng network, upang makapunta sa Internet kailangan mong pumunta mula sa 192.168.0.3 hanggang 192.168.1.1 (router), pumunta tayo sa tapat na direksyon. I-configure natin ang ruta mula 192.168.1.1 hanggang 192.168.1.2 tulad nito:

Ginagawang available ang database para sa malayuang koneksyon

Sa pangkalahatan, hindi lumalabas ang larawan, kaya isusulat ko ito sa pamamagitan ng kamay:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Magagawa lang ito sa isang subnet, ibig sabihin, hindi ka agad makapag-forward sa address na 192.168.0.2 o 192.168.0.3.

Ito ay kinakailangan upang malaman ng router kung saan matatagpuan ang subnet 192.168.0.0/24 (kapaki-pakinabang ang pag-aaral ng mga pangunahing kaalaman sa mga network).

Ngayon ay nagdaragdag kami ng port forwarding 3306 (ang default na mysql port (kung hindi mo ito binago sa panahon ng pag-install)) sa address na 192.168.1.2

Ginagawang available ang database para sa malayuang koneksyon

Ang pinakamahirap na bagay na natitira ay gawin ang pagpapasa sa isang Linux machine (ito ay may dalawang network card 192.168.1.2 (enp3s1 interface) at 192.168.0.2 (enp3s0 interface) upang malaman ng mga network card kung ano ang ililipat sa kanila mula sa 192.168.1.2 sa 192.168.0.2, at pagkatapos ay sa aming Windows machine na may 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

Yung. Ang 1st line ay nangangahulugan na tinatanggap namin ang unang koneksyon, ang ika-2 at ika-3 na maaari kaming magpadala ng mga packet sa parehong direksyon, ang ika-4 at ika-5 ay nangangahulugan ng pagpapalit ng destinasyon at pinagmulang mga address. At voila, maaari kang kumonekta mula sa bahay sa pamamagitan ng mysql. At sa wakas, ang aking C++ code na gumagawa nito:

//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;
};

Ngayon ay maaari mong ligtas na ipadala ang program na ito sa sinuman, at hindi mo na kailangang muling isulat ito upang gawin itong gumana nang lokal.

Pinagmulan: www.habr.com

Magdagdag ng komento