Að gera gagnagrunninn aðgengilegan fyrir fjartengingu

Við skulum byrja á því að það eru tilvik þegar þú þarft að gera forrit með tengingu við gagnagrunn. Þetta er gert til að kafa ekki of mikið í bakendaþróun og einbeita sér að framendanum vegna skorts á höndum og færni. Ég get ekki sagt að lausnin mín sé örugg, en hún virkar.

Þar sem mér líkar ekki að borga fyrir hýsingu notaði ég netið í vinnunni minni, það er hvítt IP þar. Hér er uppbygging þess:

Að gera gagnagrunninn aðgengilegan fyrir fjartengingu

Ég hef aðgang að nokkrum tölvum, nánar tiltekið 192.168.1.2 (aka 192.168.0.2) með Linux uppsett þar og 192.168.0.3 með Windows. Almennt séð valdi ég mysql fyrir forritið mitt og skoðaði hvað var fáanlegt á Linux. Það var þegar sett upp þar, en enginn veit lykilorðið, og þeir sem vissu gleymdu (þeir sem unnu á undan mér). Eftir að hafa komist að því að enginn þyrfti þess, eyddi ég því og reyndi að setja það upp aftur. Það var ekki nóg minni og þar sem ég þyrfti að tengja skjá og lyklaborð með mús til þess að laga þessa villu ákvað ég að gefast upp á þessu máli. Þar að auki er vélin með Windows miklu öflugri og auk þess er ég með hana á fartölvunni heima. Í grundvallaratriðum mun ég ekki lýsa uppsetningunni sjálfri; það eru til fullt af handbókum og myndböndum um hana. Eftir að hafa sett upp mysql á Windows vél ákvað ég að taka öryggisafrit af borðunum úr fartölvunni minni yfir á vinnustöðina mína.

Þetta er gert svona (í mínu tilfelli):

mysqldump -uroot -p your_base > dump_file.sql

Næst búum við til gagnagrunn í nýja gagnagrunninum og endurheimtum öryggisafritið á „nýju“ vélinni.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Afritaskráin verður að vera sett á nýju vélina og, ef ekki, ef ekki í möppunni með tólinu, þá alla leiðina að henni. (Ég hlóð bara öryggisafritinu á GitHub og klónaði það á nýja vél). Ég myndi bæta við hvernig töflurnar sjálfar eru búnar til, en ég vistaði ekki skjámyndirnar og ég held að það sé ekki erfitt jafnvel fyrir 2-3 ára nemanda.

Þegar allar töflurnar hafa verið endurheimtar er kominn tími til að gera fjaraðgang að gagnagrunninum tiltækan. Almennt séð leiddu slíkar skipanir ekki til árangurs (það gaf aðeins lesleyfi til að velja)

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

Nánar tiltekið, ég gæti aðeins tengst gagnagrunninum með skipuninni,

mysql -h localhost -u client -pclient

en þessi gat það ekki lengur

mysql -h 192.168.0.3 -u client -pclient

Þetta virkaði ekki fyrir mig og ég gat ekki tengst í gegnum þetta heimilisfang sem rót.

Mysql vinnubekkur forritið hjálpaði; í stillingunum skaltu breyta localhost í % og það virkar, þó að viðskiptavinurinn hafi ekki hjálpað. Nú geturðu tengst gagnagrunninum frá stjórnborðinu eða úr kóða frá hvaða heimilisfangi sem er.

Að gera gagnagrunninn aðgengilegan fyrir fjartengingu

Þú þarft líka að búa til heimilis- eða viðskiptanet og slökkva á Windows eldveggnum, annars muntu ekki einu sinni geta pingað þessa vél (hvað þá tengst gagnagrunninum).

Helmingurinn er búinn, nú þarf ég að geta tengst gagnagrunninum að heiman.

Eins og þú sérð á netskýringunni, til að komast á internetið þarftu að fara frá 192.168.0.3 í 192.168.1.1 (beini), við skulum fara í gagnstæða átt. Við skulum stilla leiðina frá 192.168.1.1 til 192.168.1.2 svona:

Að gera gagnagrunninn aðgengilegan fyrir fjartengingu

Almennt séð sést myndin ekki, svo ég skrifa hana í höndunum:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Þetta er aðeins hægt að gera í einu undirneti, það er, þú getur ekki framsend strax á heimilisfangið 192.168.0.2 eða 192.168.0.3

Þetta er nauðsynlegt svo að beininn viti hvar undirnetið 192.168.0.0/24 er staðsett (að læra grunnatriði netkerfa er gagnlegt).

Nú bætum við portframsendingu 3306 (sjálfgefna mysql tenginu (ef þú breyttir því ekki við uppsetningu)) við heimilisfangið 192.168.1.2

Að gera gagnagrunninn aðgengilegan fyrir fjartengingu

Það erfiðasta sem eftir er að gera er að gera áframsendingu á Linux vél (hún er með tvö netkort 192.168.1.2 (enp3s1 tengi) og 192.168.0.2 (enp3s0 tengi) þannig að netkortin viti hvað á að flytja þau úr 192.168.1.2 í 192.168.0.2 og síðan í Windows vélina okkar með 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

Þeir. 1. línan þýðir að við samþykkjum fyrstu tenginguna, 2. og 3. sem við getum sent pakka í báðar áttir, 4. og 5. þýðir að breyta áfangastað og uppruna heimilisfangi. Og voila, þú getur tengst að heiman í gegnum mysql. Og að lokum, C++ kóðinn minn sem gerir þetta:

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

Nú geturðu örugglega sent þetta forrit til hvers sem er og þú þarft ekki að endurskrifa það til að það virki á staðnum.

Heimild: www.habr.com

Bæta við athugasemd