Ir ao conteúdo
  • Cadastre-se
myNameX

RESOLVIDO Pegar IP e fazer checagem com MySQL [ C++ ]

Recommended Posts

Como pegar IP da rede da pessoa que iniciar um programa em C++?

Eu estou criando um programa que quando o usuário abrir ele, o ip dele é pego e é verificado no banco de dados se existe algum registro com o IP, se tiver ele abre o site que está registrado com o IP dele.

Meu código é (Windows Form C++)

MyForm.h

#pragma once#include <stdio.h>#include <windows.h>namespace GE {	using namespace System;	using namespace System::ComponentModel;	using namespace System::Collections;	using namespace System::Windows::Forms;	using namespace System::Data;	using namespace System::Drawing;	using namespace MySql::Data::MySqlClient;		/// <summary>	/// Summary for MyForm	/// </summary>	public ref class MyForm : public System::Windows::Forms::Form	{	public:		MyForm(void)		{			InitializeComponent();			//			//TODO: Add the constructor code here			//		}	protected:		/// <summary>		/// Clean up any resources being used.		/// </summary>		~MyForm()		{			if (components)			{				delete components;			}		}	private: System::Windows::Forms::Button^  button1;	private: System::Windows::Forms::TextBox^  textBox1;	protected:	private:		/// <summary>		/// Required designer variable.		/// </summary>		System::ComponentModel::Container ^components;#pragma region Windows Form Designer generated code		/// <summary>		/// Required method for Designer support - do not modify		/// the contents of this method with the code editor.		/// </summary>		void InitializeComponent(void)		{			this->button1 = (gcnew System::Windows::Forms::Button());			this->textBox1 = (gcnew System::Windows::Forms::TextBox());			this->SuspendLayout();			// 			// button1			// 			this->button1->Location = System::Drawing::Point(80, 145);			this->button1->Name = L"button1";			this->button1->Size = System::Drawing::Size(84, 26);			this->button1->TabIndex = 0;			this->button1->Text = L"button1";			this->button1->UseVisualStyleBackColor = true;			this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);			// 			// textBox1			// 			this->textBox1->Location = System::Drawing::Point(41, 43);			this->textBox1->Name = L"textBox1";			this->textBox1->Size = System::Drawing::Size(185, 20);			this->textBox1->TabIndex = 1;			// 			// MyForm			// 			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;			this->ClientSize = System::Drawing::Size(254, 205);			this->Controls->Add(this->textBox1);			this->Controls->Add(this->button1);			this->Name = L"MyForm";			this->Text = L"MyForm";			this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);			this->ResumeLayout(false);			this->PerformLayout();		}#pragma endregion	private: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {	}	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {		String^ constring = L"datasource=localhost;port=3306;username=root;password=";		MySqlConnection^ conDataBase = gcnew MySqlConnection(constring);		MySqlCommand ^cmdDataBase = gcnew MySqlCommand("SELECT * FROM `a`.`sites` WHERE IP='" + "FUNÇÃO QUE PEGA O IP"  + "';", conDataBase);		MySqlDataReader ^myReader;				try {			conDataBase->Open();			myReader = cmdDataBase->ExecuteReader();			while (myReader->Read()) {				System::Diagnostics::Process::Start(myReader->GetString("SiteDivulgado"));			}		}		catch (Exception^ ex)		{			MessageBox::Show(ex->Message);		}	}	};}

MyForm.cpp

#include "MyForm.h"using namespace System;using namespace System::Windows::Forms;using namespace MySql::Data::MySqlClient;[STAThread]void main(array<String^>^ args) {	Application::EnableVisualStyles();	Application::SetCompatibleTextRenderingDefault(false);	AX::MyForm form;	Application::Run(%form);}

Espero que alguém consiga me ajudar, abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como pegar IP da rede da pessoa que iniciar um programa em C++?

Sem nenhum código a pergunta fica "muito vaga" . . . Como são as tabelas do banco ? O banco é remoto ? Local ? As pessoas que acessam o programa estão na mesma rede local ? O programa usa MVC (camada 3) para acessar o banco ? Enfim . . . A sua pergunta ficou muito vaga =) . . .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem nenhum código a pergunta fica "muito vaga" . . . Como são as tabelas do banco ? O banco é remoto ? Local ? As pessoas que acessam o programa estão na mesma rede local ? O programa usa MVC (camada 3) para acessar o banco ? Enfim . . . A sua pergunta ficou muito vaga =) . . .

 

Estou querendo pegar o IP da rede do usuário (Ex: em PHP eu uso $_SERVER["REMOTE_ADDR"]), é o IP externo, a parte do MySQL eu já tenho, só preciso pegar o Ip externo do usuário pra fazer uma verificação se existe no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que isso deve servir . . . Esse código abaixo retorna "TODOS" os IPs privados, e o IP público do usuário  =) . . .

#include <windows.h> #include <wininet.h> #include <iostream>#include <stdio.h> #include <winsock.h> #include <conio.h>#include <windows.h> WSADATA data; SOCKET winsock; SOCKADDR_IN sock; #pragma comment(lib, "wininet")#pragma comment(lib, "wsock32.lib")int IPs_Local(){	char buffer[1024];	char buffer2[1024];	int bytes;	char NomeDaMaquina[80];	struct hostent *IPsDaMaquina;	struct in_addr addr;	if(WSAStartup(MAKEWORD(1,1),&data) == SOCKET_ERROR) {                                               		printf("Erro ao inicializar o winsock"); 		getch();		return NULL; 	} 	if((winsock = socket(AF_INET,SOCK_STREAM,0)) == SOCKET_ERROR){ 		printf("Erro ao criar socket"); 		getch();		return 0; 	} 		if (gethostname(NomeDaMaquina, sizeof(NomeDaMaquina)) == SOCKET_ERROR) {		printf("Erro %s\n", WSAGetLastError());        return NULL;    }	printf("Nome da maquina: %s\n", NomeDaMaquina);	IPsDaMaquina = gethostbyname(NomeDaMaquina);    if (IPsDaMaquina == 0) {		printf("Problema no Host !\n");        return NULL;    }		// Retorna todos os IPs locais . . . Ethernet adaptador local, Ethernet adaptador VMware (VMnet1), Ethernet adaptador VMware (VMnet8), Ethernet adaptador VirtualBox	// Só digita ipconfig que você vai ver todos os seus IPs locais . . . Como o local IPv4	for(int i = 0; IPsDaMaquina->h_addr_list[i] != 0; ++i) {		memcpy(&addr, IPsDaMaquina->h_addr_list[i], sizeof(struct in_addr));		printf( "IP %d : %s\n", i, inet_ntoa(addr));    }	closesocket(winsock); 	WSACleanup();	return 0;}void IP_Publico(){    HINTERNET AbrirPagina, CarregaResposta;    DWORD Tamanho;	char IP[47];    AbrirPagina = InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);    CarregaResposta = InternetOpenUrlA(AbrirPagina, "http://icanhazip.com/", NULL, 0, INTERNET_FLAG_RELOAD, 0);    InternetReadFile(CarregaResposta, &IP, sizeof(IP), &Tamanho);    IP[Tamanho] = '\0';    InternetCloseHandle(CarregaResposta);    InternetCloseHandle(AbrirPagina);    printf("IP publico: %s\n", IP);}int main(int argc, char* argv[]){	IPs_Local();	IP_Publico();	system("PAUSE");}

Compartilhar este post


Link para o post
Compartilhar em outros sites

está dando erro ao colocar, eu coloquei o código todo no tópico.

 

Eu tenho que colocar dentro do código .cpp ou .h?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Copia só a função: IPs_Local() e IP_Publico() e bibliotecas pra dentro do seu codigo . . . Qual a mensagem de erro do compilador ? Como tem form, você deve ter aberto um projeto Visual C++ . . . 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui desse jeito

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {		HINTERNET AbrirPagina, CarregaResposta;		DWORD Tamanho;		char IP[47];		AbrirPagina = InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);		CarregaResposta = InternetOpenUrlA(AbrirPagina, "http://icanhazip.com/", NULL, 0, INTERNET_FLAG_RELOAD, 0);		InternetReadFile(CarregaResposta, &IP, sizeof(IP), &Tamanho);		IP[Tamanho] = '\0';		InternetCloseHandle(CarregaResposta);		InternetCloseHandle(AbrirPagina);		textBox1->Text = Convert::ToString(IP);		String^ constring = L"datasource=localhost;port=3306;username=root;password=";		MySqlConnection^ conDataBase = gcnew MySqlConnection(constring);		MySqlCommand ^cmdDataBase = gcnew MySqlCommand("SELECT * FROM `a`.`sites` WHERE IP='" + printf(IP) + "';", conDataBase);		MySqlDataReader ^myReader;			try {			conDataBase->Open();			myReader = cmdDataBase->ExecuteReader();			while (myReader->Read()) {								System::Diagnostics::Process::Start(myReader->GetString("SiteDivulgado"));			}		}		catch (Exception^ ex)		{			MessageBox::Show(ex->Message);		}	}

Na textbox que eu criei está aparecendo apenas "TRUE"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não reparo, mas eu to só imprimindo os IPs dentro das funções, eu não estou retornando as variáveis que possuem os IPs, é só você retornar os IPs das funções que deve funcionar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×