Ir ao conteúdo
  • Cadastre-se

C++ Programa de C++ que conecta a VPN sozinho


Yoda TI

Posts recomendados

O que você quer dizer exatamente quando fala:

Citação

conecta a VPN

A VPN têm mais haver com infra do que com programação pura e simplesmente.

 

Eu tenho microservices que rodam em servidores que possuem VPN, mais fica implicito pro programador a VPN, isso é algo criado pela infra do datacenter ... Por isso não compreendi as entrelinhas da sua pergunta.

Link para o comentário
Compartilhar em outros sites

E?

 

acho que sabe que é pouca informação para alguém ajudar...

 

O software que usa para a VPN seria provido como? Se a VPN expõe uma API para controle e monitoramento você só precisa usar as funções certas e se identificar e monitorar o serviço. 

Se roda como um serviço, via cron ou no windows, você precisa ter uma conta com privilégios suficientes para acessar essas estruturas e controlar os serviços usando os mecanismos do sistema operacional. 

Se roda via coisas como scripts em /etc/inetd ou algo assim você precisa estudar esses scripts de ativação e usar coisas como systemctl para consultar o serviço e eventualmente escrever outros scripts e colocar nos lugares certos...

 

Acho que precisa explicar melhor o cenário, plataformas, versões, fornecedor da VPN, cosas assim. E talvez o suporte do fornecedor da VPN possa ser mais útil. 

Link para o comentário
Compartilhar em outros sites

@Plástico Bolha Trabalho com VPN acesso ou seja criei 1 VPN de acesso em meu servidor, criei usuarios com senhas e login, cada terminal usa 1 VPN cada VPN eu setei 1 IP FIXO no 200.111.88.999 ex.. uso VNC para acesso remoto e com a VPN e como se a maquina q esta em cidade de fora estivesse na minha rede entao consigo acessar remotamente qualquer pc, e usamos a VPN pra trafegar arquivos de segurança nossa para a empresa, o que preciso è de 1 codigo fonte de C++ na epoca da minha facul o professor ensinou um código de C++ que compilavamos e criavamos 1 programa de .EXE que executava na maquina e se auto conectava na VPN a cada 3 em 3 minutos, pois a internet pode da 1 taxa de queda e acabar caindo a coneccao pra isso esse programa entre em jogo pra forçar o PC se conecta sozinho porque os funcionarios tem preguica de conectar em 1 VPN.

adicionado 0 minutos depois

@arfneto Trabalho com VPN acesso ou seja criei 1 VPN de acesso em meu servidor, criei usuarios com senhas e login, cada terminal usa 1 VPN cada VPN eu setei 1 IP FIXO no 200.111.88.999 ex.. uso VNC para acesso remoto e com a VPN e como se a maquina q esta em cidade de fora estivesse na minha rede entao consigo acessar remotamente qualquer pc, e usamos a VPN pra trafegar arquivos de segurança nossa para a empresa, o que preciso è de 1 codigo fonte de C++ na epoca da minha facul o professor ensinou um código de C++ que compilavamos e criavamos 1 programa de .EXE que executava na maquina e se auto conectava na VPN a cada 3 em 3 minutos, pois a internet pode da 1 taxa de queda e acabar caindo a coneccao pra isso esse programa entre em jogo pra forçar o PC se conecta sozinho porque os funcionarios tem preguica de conectar em 1 VPN.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Yoda TI disse:

ensinou um código de C++ que compilavamos e criavamos 1 programa de .EXE que executava na maquina e se auto conectava na VPN a cada 3 em 3 minutos, pois a internet pode da 1 taxa de queda e acabar caindo a coneccao pra isso esse programa entre em jogo pra forçar o PC se conecta sozinho porque os funcionarios tem preguica de conectar em 1 VPN

 

8 horas atrás, arfneto disse:

Se a VPN expõe uma API para controle e monitoramento você só precisa usar as funções certas e se identificar e monitorar o serviço

 

Pois é. Foi o que eu disse. SE a VPN expõe uma API --- na forma de uma bliblioteca de funções em C por exemplo --- ou uma série de scripts como eu disse, tudo que voê precisa é usar sockets em seu programa paa verificar conectividade com alguém do outro lado da VPN, usar um timer para verificar a cnexão, e usar uma função para se conectar novamente.

 

Na verdade nem precisa de tudo isso porque os sistemas operacionais tem agendas de execução e você pode lá executar qualquer coisa a cada dois minutos, usando a agenda do windows ou o cron no linux.

 

Também não precisa de sockets e TCP/IP em seu programa C++ porque pode executar um script ou o seu programa a cada a cada x minutos e usar ferramentas como ping para verificar conectividade

 

E como eu disse se a VPN roda como serviço no windows  -- daemon no Unix/Linux/Mac -- tem uma lógica que pode ativar sózinha os serviços, porque é uma necessidade comum...

 

Não tenho tempo agora de ver no Linux porque tenho uma regra minha para postar no forum --- só uma máquina, só um sistema, só um compilador, sem WSL, só essas linguagens e o outro forum de redes e tal :D --- mas veja esse formulário do Windows, que é igualzinho desde décadas atrás, que você acessa por exemplo escrevendo Window+R em seu terminal, depois services.msc e enter, e selecionando o serviço de precisa monitorar:

 

netbrowser.png.610174878dbc2dde893f437bb73beb42.png

 

Claro que escrever um programa em C++ que roda como serviço ou daemon é um caminho mais elegante, mas pode não precisar de nada disso. Mesmo um script de poucas linhas já faria o trabalho.

 

Também não precisa de C++ a menos que vá usar uma biblioteca em  C++. Não parece haver razão para classes complexas, monitorar várias redes, interface gráfica sofisticada ou algo assim. 

 

Conclusão: qual a VPN que usa? Qual o método de conexão? o que fica no ar é um serviço, um daemon ou programa qualquer?

 

adicionado 3 minutos depois

Bem, não custa nada mostrar um exemplo para windows, direto da fonte que lista todos os processos que estão rodando em sua máquina. Em C++.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1

void PrintProcessNameAndID( DWORD processID )
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }

    // Print the process name and identifier.

    _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );

    // Release the handle to the process.

    CloseHandle( hProcess );
}

int main( void )
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    {
        return 1;
    }


    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
    {
        if( aProcesses[i] != 0 )
        {
            PrintProcessNameAndID( aProcesses[i] );
        }
    }

    return 0;
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@arfneto muito obrigado :)

 

adicionado 24 minutos depois

@arfneto Bem voce ja me esclareceu uma duvida, o servico de VPN q usamos é o mais simples e configurando na estância como VPN ACESSO, ou seja e so pra acessar o servidor de 'BD' para mandar dados e para me auxiliar pois acesso Remotamente algumas maquinas para dar assistencia, daí o Anydesk ou TeamV. tem muita democracia tem q pedir ID esperar aceitar coneccao ... por VNC e mais pratico e rápido porém o VNC precisa ser acessado de redes locais a VPN entra ai pra simular 1 rede local e pra trasferir arquivos nosso exemplo nossas XML das notas fiscais eletronicas, eu queria fazer 1 programa q executava na maquina eu escrevia o usuario e a senha da VPN antes de compilar e compilava o programa ia se auto conectar a VPN a cada 3 minutos entendeu, fazer o trabalho q a pessoa do caixa deveria fazer q era conectar a VPN porém eles tem tanta preguica q nao conecta , ai a solucao q achei foi essa de criar 1 programa q se conecta na VPN automaticamente , a VPN dos terminais e apenas pra acesso remoto e transferencia de arquivos.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Yoda TI disse:

o servico de VPN q usamos é o mais simples e configurando na estância como VPN ACESSO, ou seja e so pra acessar o servidor de 'BD' para mandar dados e para me auxiliar pois acesso Remotamente algumas maquinas para dar assistencia

 

O mais simples? Mas que serviço é esse? Tem um nome? usa os serviços do sistema para criar uma conexão tipo  IPSEC ou o que? qual o o mecanismo para por isso no ar ou tirar? Você não está explicando. Tem uma API? Tem scripts de ativação? qual a plataforma?

 

2 horas atrás, Yoda TI disse:

o Anydesk ou TeamV. tem muita democracia tem q pedir ID esperar aceitar coneccao

 

Imagino que pretendia escrever "burocracia" e "conexão".  O Team Viewer pode ser configurado para conexão automática e opcionalmente desligar a tela do computador que está sendo acessado. E tem um módulo para transferência de arquivos embutido. E tem uma coisa que eu uso muito e que pode ser útil, não sei o sei o seu cenário, pode-se usar o TeamViewer para ligar uma máquina que está desligada. Bem razoável quando o funcionário vai embora e é preciso aplicar uma atualização na máquina. Veja no programa as opcões para WakeOnLan. Desde que ele não tenha desligado da tomada, claro...

 

2 horas atrás, Yoda TI disse:

por VNC e mais pratico e rápido porém o VNC precisa ser acessado de redes locais a VPN entra ai pra simular 1 rede local e pra trasferir arquivos nosso exemplo nossas XML das notas fiscais eletronicas, eu queria fazer 1 programa q executava na maquina eu escrevia o usuario e a senha da VPN antes de compilar e compilava o programa ia se auto conectar a VPN a cada 3 minutos entendeu

 

Não é assim. VNC não precisa de rede local, apenas de uma porta e que pode ser qualquer uma. Então você precisa apenas configurar rotas de encaminhamento nos roteadores e pode usar qualquer cliente VNC.

 

2 horas atrás, Yoda TI disse:

conectar a VPN porém eles tem tanta preguica q nao conecta , ai a solucao q achei foi essa de criar 1 programa q se conecta na VPN automaticamente , a VPN dos terminais e apenas pra acesso remoto e transferencia de arquivos

 

Entendo. MAs não precisa de um programa. Pode escrever um script que testa a conectividade por qualquer meio e ativa a VPN se antes de iniciar a transferência de arquivos.

 

VPN sem configuração

 

LogmeIn Hamachi --- https://www.vpn.net/ --- é uma VPN grátis para até 5 nós que é bem flexível e não tem nem configuração. É muito esperto e já usei para muitas coisas parecidas. Na versão grátis não roda como serviço mas dá pra improvisar algo nos moldes do que expliquei antes.

 

Uma VPN fácil de controlar

 

e mais versátil que o Hamachi LogmeIN é a clássica OpenVPN --- veja em https://openvpn.net/vpn-server-resources/ --- que tem uma versão também grátis e já usei para coisas assim. É bem fácil de controlar via scripts ou mesmo via programa.

 

Link para o comentário
Compartilhar em outros sites

Cara, como o @arfneto disse, falta infomações para te darmos o melhor caminho, existem N soluções mais qual seria a mais viável e simples dado o seu problema ... Enfim ... Se você quer criar algum socket que fique rodando estilo client/server etc ... Apenas altere esse código para os seus propósitos @Yoda TI

 

 

Socket server TCP/IP

// SERVER.C  ###
#include <stdio.h>  
#include <conio.h>
#include <winsock.h>  // Inclui o header do winsock.
#include <windows.h> // Repara que este header é para utilizarmos a função Sleep(); 

#pragma comment(lib, "wsock32.lib") // -l wsock32 -l Ws2_32  DLL ...
#pragma comment(lib, "Ws2_32.lib") // -l wsock32 -l Ws2_32 DLL ...

// Variíveis que recebem o valor da inicialização e criação do socket.
WSADATA data; 
SOCKET winsock; // Socket NÃO inicializado apenas criado ... 
SOCKADDR_IN sock; // É um Struct e dentro dele contém a configuração do socket a ser usado o ip, a porta e a família do socket.
char buffer[1024];
char buffer2[1024];
int bytes;

int main()
{   //WSAStartup - Inicializa o uso do winsock. Isso e pra definir a versao do socket 
	if(WSAStartup(MAKEWORD(1,1),&data) == SOCKET_ERROR){  // A sintaxe é : WSAStartup(VERSAO_DO_WINSOCK,ENDEREÇO DA VARIÁVEL)
		printf("Erro ao inicializar o winsock");          // A função retorna o valor 0 (zero) quando é finalizada com sucesso ou -1, quando um erro ocorre.
		return 0; 
	} 

	//socket - Inicializa o socket.
	if((winsock = socket(AF_INET,SOCK_STREAM, 0)) == SOCKET_ERROR){  // A sintaxe é: socket(FAMILIA,TIPO_DE_PROTOCOLO,0)
		printf("Erro ao criar socket!!!"); 
		return 0; 
	} 
	/*
	utilizo o AF_INET,
	Tipo de protocolo:
	SOCK_STREAM -> protocolo TCP // Utilizaremos o SOCK_STREAM
	SOCK_DGRAM -> protocolo UDP
	SOCK_RAW -> protocolo para RAW SOCKETS.
	OBS: Assim como a função WSAStartup, esta retorna os valores: 0 (Socket inicializado) ou 1 (não inicializado).
	*/

	sock.sin_family = AF_INET; 
	sock.sin_port = htons(1234); 

	if(bind(winsock,(SOCKADDR*)&sock,sizeof(sock)) == SOCKET_ERROR){  // Assim como a função WSAStartup e socket, a função BIND também retorna um valor,
		printf("Erro ao abrir a porta no sistema (Erro em bind)!!!"); // que por sinal, são os mesmos. Esta função é responsível por colocar o socket no modo BIND(configura-lo na porta local).
		return 0;                                                    // int bind (socket, estrutura de conexao (local), tamanho da estrutura); 
	}                                                                // A função bind() faz o papel de abrir a porta no sistema. 

	listen(winsock, 1); // listen(winsock,1) -> Coloca o socket em modo de espera, aceitando 1 conexão.


	printf("Aguardando conexao!!!\n\n");
	while((winsock = accept(winsock, NULL ,NULL)) == SOCKET_ERROR) // listen(winsock,1) -> Coloca o socket em modo de espera, aceitando 1 conexão.
	{                                                      // Criamos um loop para verificarmos se houve um pedido de conexão, como a função ACCEPT retorna -1 quando não há pedidos,
		Sleep(1);                                          // o loop será feito até que o retorno seja diferente de -1, que indica um pedido de conexão.
	}                                                      // Ao sair do loop, é mostrada na tela uma mensagem dizendo que houve uma conexão e em seguida o programa encerra.
	                                                       // novo socket = accept (socket, estrutura de conexao, tamanho); 
	printf("Cliente conectado!!!\n");


	// APÓS TER ESTABELICIDO A CONEXÃO É POSSIVEL ENVIAR E RECEBER DADOS OU QUALQUER OUTRA COISA DO TIPO ...

	while(1){
		Sleep(1);
		memset(buffer2, 0, 1024);
		bytes = recv(winsock, buffer2, 1024, 0);
		if(bytes == -1){
			printf("Conexão perdida!!!\n");
			closesocket(winsock); // Fecha o Socket
			WSACleanup(); // Essa função termina uso a ws2.dll. Para evitar acesso desnecessário a dll ws2.dll
			getch(); 
			return 0;
		}
		printf(buffer2); // Aqui é pra printa o que voce recebeu do cliente
		printf("To: ");  // Esse To e pra voce digitar o que quer enviar pro cliente ... Mesmo voce como servidor tem como enviar coisas ao cliente sem problemas ...
		gets(buffer); // Pega o que voce digitou
		printf("\n");
		strcat(buffer,"\r\n"); // Da uma formatacao fulera no que voce digitou ... =P 
		send(winsock, buffer, strlen(buffer), 0); 
        // Envia pro cliente o que você digitou. Como voce (servidor) "aceitou" (e recebeu dados) o winsock possui os dados do cliente ...
        // Por isso mesmo sem voce configurar o ip e porta do cliente e porcarias do tipo ... voce ainda consegue se comunicar com o cliente por causa disso
	}

	getch();
	closesocket(winsock); // Fecha o Socket
	WSACleanup(); // Essa função termina uso a ws2.dll. Para evitar acesso desnecessário a dll ws2.dll
	return 0; 
} // Pra rodar isso no DevC++ 4.9.9.2 vai em  "Compiler Options" e digita la : -l wsock32 -l Ws2_32 e marca a opção "add the following commands when calling compiler"

 

Socket client TCP/IP

 

//CLIENTE

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")


#define DEFAULT_BUFLEN 128
#define DEFAULT_PORT "27015"

int __cdecl main(int argc, char **argv) 
{
    char texto[128];
    WSADATA wsaData;
    SOCKET ConnectSocket = INVALID_SOCKET;
    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;
//    Carregar buffer;
    char recvbuf[DEFAULT_BUFLEN];
    int iResult;
    int recvbuflen = DEFAULT_BUFLEN;

    argv[1] = "localhost";
    argc = 2;

    // Validar os parâmetros
    if (argc != 2) {
        printf("usage: %s server-name\n", argv[0]);
        return 1;
    }

    // Inicializar o Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    ZeroMemory( &hints, sizeof(hints) );
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    // Resolve o endereço do servidor e a porta
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if ( iResult != 0 ) {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        return 1;
    }

    // Tentar se conectar a um endereço, até que um bem-sucedido
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

        // Criar um Socket para se conectar ao servidor
        ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
            ptr->ai_protocol);
        if (ConnectSocket == INVALID_SOCKET) {
            printf("socket failed with error: %ld\n", WSAGetLastError());
            WSACleanup();
            return 1;
        }

        // Conectar ao servidor.
        iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
        if (iResult == SOCKET_ERROR) {
            closesocket(ConnectSocket);
            ConnectSocket = INVALID_SOCKET;
            continue;
        }
        break;
    }

    freeaddrinfo(result);

    if (ConnectSocket == INVALID_SOCKET) {
        printf("Unable to connect to server!\n");
        WSACleanup();
        return 1;
    }
    else
    {
        printf("Conexao estabelecida... \n");
    }

   do { 
        printf("digite a mensagem..: ");
        scanf("%s", texto);
        iResult = send( ConnectSocket, texto, (int)128, 0 ); //enviar para o servidor
        if (iResult == SOCKET_ERROR) 
           printf("send failed with error: %d\n", WSAGetLastError());
        else { /* espera ack do servidor */
            iResult=recv(ConnectSocket, recvbuf, iResult, 0 ); //recebe do servidor
            if ( iResult < 0 )
                printf("erro recebendo no socket");
            else {
                 recvbuf[iResult]='\0';
                 printf("Cliente recebeu: %s\n",recvbuf);
            }
        }
  } while (strcmp(texto,"fim"));

    //Limpeza;
    closesocket(ConnectSocket);
    WSACleanup();
    printf("Conexão finalizada... \n");
    system("pause");
    return 0;
}

 

Mais assim @Yoda TI, parece meio estranho isso que você está tentando fazer, não parece digamos "usual", é meio sei lá, já têm um monte de coisas prontas pra lidar com VPN como o @arfneto disse acima ... Eu te passei esse código que é extremamente básico para fazer um client/server com C/C++ bem simples, te dei uma espécie de hello world, apenas um ponto de partida client/server C/C++, mais você vai ter que fazer conversão de XML, vai ter que brincar com SSL no  meio disso aí, se o  seu servidor tiver certificado SSL você vai ter que utilizar o certificado pra abrir conexão com o server etc etc etc ... Se você modificar esse código para os seus propósitos Ok, funciona ... Mais analisando o que você escreveu me parece uma abordagem "estranha" para este problema. Eu trabalho com microserviços já têm 2 anos, lido com servidor etc etc etc ... E sei lá ... Tá meio estranho essa abordagem ... Mais segue o código.

 

E se você está disponibilizando algo como uma API no seu servidor, eu não recomendaria você fazer isso com C/C++, porque você vai ter que fazer o server na unha rsrs, apenas se você precisa-se de performance extrema na sua API recomendaria C/C++, que não me parece exatamente o caso ... Os caras utilizam outras linguagens que são mais voltadas para este nicho como Node.js, Python, GO, Ruby ... Mercado livre usa GO, Uber usa Node.js e GO, Sentry usa Python e Node.js enfim ... A galera faz API em C/C++ geralmente para aplicação de redes neurais em IA por exemplo, ou coisas dessa natureza, que necessitem realmente de performance e controle extremo em cima do hardware ... Pense nisso rsrs att ... Não é que vai ficar ruim fazer com C/C++, muito pelo contrário, C/C++ é maravilhoso, linguagem top para aplicações de alta performance, no entanto, você vai ter que fazer muita coisa na mão rsrs ...

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...