දුරස්ථ සම්බන්ධතාවය සඳහා දත්ත සමුදාය ලබා දීම

ඔබට දත්ත සමුදා සම්බන්ධතාවයක් සමඟ යෙදුමක් සෑදීමට අවශ්‍ය අවස්ථා ඇති බව අපි පටන් ගනිමු. මෙය සිදු කරනු ලබන්නේ අත් සහ කුසලතා නොමැතිකම හේතුවෙන් පසුපස-අන්තයේ සංවර්ධනය ගැන ඕනෑවට වඩා ගැඹුරට නොයැවීම සහ ඉදිරිපස අන්තය කෙරෙහි අවධානය යොමු කිරීම සඳහා ය. මගේ විසඳුම ආරක්ෂිත වනු ඇතැයි මම නොකියමි, නමුත් එය ක්රියා කරයි.

මම Hosting වලට ගෙවන්න කැමති නැති නිසා මම මගේ වැඩේට Network එක පාවිච්චි කලා සුදු IP එකක් තියෙනවා. මෙන්න එහි ව්යුහය:

දුරස්ථ සම්බන්ධතාවය සඳහා දත්ත සමුදාය ලබා දීම

මට පරිගණක කිහිපයකට ප්‍රවේශය ඇත, වඩාත් නිවැරදිව 192.168.1.2 (එනම් 192.168.0.2) වෙත Linux සහ 192.168.0.3 Windows සමඟ ඇත. පොදුවේ, මගේ යෙදුම සඳහා, මම mysql තෝරාගෙන Linux හි ඇති දේ දෙස බැලුවෙමි. එය දැනටමත් එහි ස්ථාපනය කර ඇත, නමුත් කිසිවෙකු මුරපදය දන්නේ නැත, සහ දන්නා අයට අමතක විය (මට පෙර වැඩ කළ අය). කාටවත් ඕන නෑ කියලා දැනගත්තට පස්සේ ඒක ඩිලීට් කරලා ආයෙත් ඉන්ස්ටෝල් කරන්න හැදුවා. ප්‍රමාණවත් මතකයක් නොතිබූ අතර, මෙම දෝෂය නිවැරදි කිරීමට මට මොනිටරයක් ​​​​සහ යතුරු පුවරුවක් මූසිකයක් සමඟ සම්බන්ධ කිරීමට සිදුවනු ඇති බැවින්, මම මෙම ව්‍යාපාරයෙන් ඉවත් වීමට තීරණය කළෙමි. එපමණක් නොව, වින්ඩෝස් යන්ත්‍රයක් වඩා බලවත් වන අතර, සියල්ලටම අමතරව, මම එය නිවසේ මගේ ලැප්ටොප් පරිගණකයේ ඇත. ප්‍රතිපත්තිමය වශයෙන්, මම ස්ථාපනයම විස්තර නොකරමි, ඒ පිළිබඳ අත්පොත් සහ වීඩියෝ ගොඩක් තිබේ. වින්ඩෝස් යන්ත්‍රයක mysql ස්ථාපනය කිරීමෙන් පසු, මම ලැප්ටොප් එකක සිට වැඩපොළකට වගු උපස්ථ කිරීමට තීරණය කළෙමි.

එය සිදු කරනු ලබන්නේ මේ ආකාරයට ය (මගේ නඩුවේදී):

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% ලෙස වෙනස් කර එය ක්‍රියා කරයි, නමුත් සේවාදායකයා උදව් නොකළද. දැන් ඔබට කොන්සෝලයෙන් හෝ ඕනෑම ලිපිනයකින් කේතයෙන් දත්ත සමුදායට සම්බන්ධ විය හැක.

දුරස්ථ සම්බන්ධතාවය සඳහා දත්ත සමුදාය ලබා දීම

ඔබට නිවසක් හෝ ව්‍යවසාය ජාලයක් සාදා වින්ඩෝස් ෆයර්වෝලය ක්‍රියා විරහිත කළ යුතුය, එසේ නොමැතිනම් ඔබට මෙම යන්ත්‍රය පිං කිරීමට පවා නොහැකි වනු ඇත (එය දත්ත සමුදායට සම්බන්ධ නොවන බව නොවේ).

වැඩේ බාගයක් ඉවරයි, එතකොට මට ගෙදර ඉඳන් ඩේටාබේස් එකට කනෙක්ට් වෙන්න ඕන.

ජාල රූප සටහනෙන් ඔබට පෙනෙන පරිදි, ඔබ 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 ලිපිනයට port forwarding 192.168.1.2 (mysql port පෙරනිමියෙන් (ඔබ එය ස්ථාපනය කිරීමේදී වෙනස් නොකළේ නම්)) එකතු කරමු.

දුරස්ථ සම්බන්ධතාවය සඳහා දත්ත සමුදාය ලබා දීම

දැන් කරන්න තියෙන අමාරුම වැඩේ තමයි Linux Machine එකක Forwarding කරන එක (එකේ Network Cards දෙකක් තියෙනවා 192.168.1.2 (enp3s1 interface) සහ 192.168.0.2 (enp3s0 interface) එවිට Network Cards 192.168.1.2 සිට මාරු කරන්නේ මොනවද කියලා දැනගන්නවා. 192.168.0.2 වෙත, පසුව MySql සමඟ අපගේ Windows යන්ත්‍රයට.

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 යන්නෙන් අදහස් කරන්නේ ගමනාන්තය සහ මූලාශ්‍ර ලිපිනය ප්‍රතිස්ථාපනය කිරීමයි. සහ voila, ඔබට 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

අදහස් එක් කරන්න