ریموٹ کنکشن کے لیے ڈیٹا بیس کو دستیاب کرنا

آئیے اس حقیقت کے ساتھ شروع کرتے ہیں کہ ایسے معاملات ہوتے ہیں جب آپ کو ڈیٹا بیس سے کنکشن کے ساتھ درخواست بنانے کی ضرورت ہوتی ہے۔ یہ اس لیے کیا جاتا ہے کہ بیک اینڈ کی ترقی میں بہت زیادہ توجہ نہ دی جائے اور ہاتھ اور مہارت کی کمی کی وجہ سے فرنٹ اینڈ پر توجہ مرکوز کی جائے۔ میں یہ نہیں کہہ سکتا کہ میرا حل محفوظ رہے گا، لیکن یہ کام کرتا ہے۔

چونکہ مجھے ہوسٹنگ کے لیے ادائیگی کرنا پسند نہیں ہے، اس لیے میں نے اپنے کام پر نیٹ ورک کا استعمال کیا، وہاں ایک سفید IP ہے۔ یہاں اس کی ساخت ہے:

ریموٹ کنکشن کے لیے ڈیٹا بیس کو دستیاب کرنا

میرے پاس کئی کمپیوٹرز تک رسائی ہے، زیادہ واضح طور پر 192.168.1.2 (عرف 192.168.0.2) لینکس کے ساتھ اور ونڈوز کے ساتھ 192.168.0.3۔ عام طور پر، میں نے اپنی درخواست کے لیے mysql کا انتخاب کیا اور دیکھا کہ لینکس پر کیا دستیاب ہے۔ یہ وہاں پہلے سے ہی انسٹال تھا، لیکن کوئی بھی پاس ورڈ نہیں جانتا، اور جو لوگ جانتے تھے وہ بھول گئے (جو مجھ سے پہلے کام کرتے تھے)۔ یہ جاننے کے بعد کہ کسی کو اس کی ضرورت نہیں ہے، میں نے اسے حذف کر دیا اور دوبارہ انسٹال کرنے کی کوشش کی۔ کافی میموری نہیں تھی، اور چونکہ اس غلطی کو ٹھیک کرنے کے لیے مجھے ایک مانیٹر اور کی بورڈ کو ماؤس سے جوڑنا پڑے گا، اس لیے میں نے اس معاملے کو ترک کرنے کا فیصلہ کیا۔ مزید یہ کہ ونڈوز والی مشین بہت زیادہ طاقتور اور پلس ہے، یہ میرے گھر میں اپنے لیپ ٹاپ پر موجود ہے۔ اصولی طور پر، میں خود تنصیب کی وضاحت نہیں کروں گا؛ اس کے بارے میں بہت سارے دستورالعمل اور ویڈیوز موجود ہیں۔ ونڈوز مشین پر 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

اس نے میرے لیے کام نہیں کیا اور میں اس ایڈریس کے ذریعے جڑ کے طور پر رابطہ نہیں کر سکا۔

mysql ورک بینچ پروگرام نے مدد کی؛ سیٹنگز میں لوکل ہوسٹ کو % میں تبدیل کریں اور یہ کام کرتا ہے، حالانکہ کلائنٹ نے مدد نہیں کی۔ اب آپ کنسول سے یا کسی بھی ایڈریس کے کوڈ سے ڈیٹا بیس سے جڑ سکتے ہیں۔

ریموٹ کنکشن کے لیے ڈیٹا بیس کو دستیاب کرنا

آپ کو گھر یا کاروباری نیٹ ورک بنانے اور ونڈوز فائر وال کو بند کرنے کی بھی ضرورت ہے، بصورت دیگر آپ اس مشین کو پنگ بھی نہیں کر پائیں گے (ڈیٹا بیس سے منسلک ہونے دیں)۔

آدھا کام ہو چکا ہے، اب مجھے گھر سے ڈیٹا بیس سے منسلک ہونے کی ضرورت ہے۔

جیسا کہ آپ نیٹ ورک ڈایاگرام سے دیکھ سکتے ہیں، انٹرنیٹ پر جانے کے لیے آپ کو 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 میں شامل کرتے ہیں۔

ریموٹ کنکشن کے لیے ڈیٹا بیس کو دستیاب کرنا

سب سے مشکل کام جو باقی رہ گیا ہے وہ ہے لینکس مشین پر فارورڈنگ کرنا (اس میں دو نیٹ ورک کارڈز 192.168.1.2 (enp3s1 انٹرفیس) اور 192.168.0.2 (enp3s0 انٹرفیس) ہیں تاکہ نیٹ ورک کارڈز جان سکیں کہ انہیں 192.168.1.2 سے کیا منتقل کرنا ہے۔ 192.168.0.2 تک، اور پھر 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

وہ. پہلی لائن کا مطلب یہ ہے کہ ہم پہلا کنکشن قبول کرتے ہیں، دوسرا اور تیسرا جسے ہم دونوں سمتوں میں پیکٹ بھیج سکتے ہیں، چوتھی اور پانچویں کا مطلب ہے منزل اور ماخذ کے پتے تبدیل کرنا۔ اور 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

نیا تبصرہ شامل کریں