Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alecgn

Geração de endereços de IP - C++

Recommended Posts

Olá pessoal... sou iniciante em C++ estou tendo alguns probleminhas com um código que estou implementando... o programa tem o seguinte propósito: ler um endereço IP inicial e um final digitados pelo usuário, mostrar todos os IPs da faixa de endereços... Na realidade pretendo implementar o programa para testar se todos os hosts da faixa de endereços estão "vivos" (operacionais), mas preciso de ajuda para a lógica da geração dos IPs da faixa...

 

Escrevi esse código bem simples que exibe na tela TODOS os endereços existentes, mas preciso de um código que armazene o IP resultante das 4 variáveis OCT para uma outra variável do tipo string, exibindo um IP por vez; segue-se o código:

 

#include <iostream>
using namespace std;

int main()
{
    int OCT1, OCT2, OCT3, OCT4; // 4 OCTETOS DE UM ENDEREÇO IP
	
	for (OCT1 = 0; OCT1 <= 255; OCT1++)
	for (OCT2 = 0; OCT2 <= 255; OCT2++)
    for (OCT3 = 0; OCT3 <= 255; OCT3++)
    for (OCT4 = 0; OCT4 <= 255; OCT4++)
	
	cout << OCT1 << "." << OCT2 << "." << OCT3 << "." << OCT4 << "\n";
	
	system ("pause > nul");
	return 0;
}

Alguém poderia dar uma luz ?

Antecipadamente agradeço...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Alecgn, seja bem vindo ao fórum!

 

Você pode fazer o seguinte:

(atenção: pseudocódigo)


typedef struct IP_st
{
    int o1, o2, o3, o4;
} IP_t;

// você define essas funções!
IP_t string_to_ip(string str);
string ip_to_string(IP_t ip);

int cmp_ip(IP_t ip1, IP_t ip2); //compara dois IP_t, retorna 0 se forem iguais, -1 se ip1 > ip2 ou 1 se ip1 < ip2
void incrementa_ip(IP_t &ip); //incrementa o endereço de IP.

int main()
{
IP_t inicio, final;

    inicio = string_to_ip(getline());
    final = string_to_ip(getline());

    int r = cmp_ip(inicio, final)
    if (r != 1)
    {
        print("ERRO: o endereço de ip final deve ser maior que o inicial!\n");
        return 1;
    }

    while (cmp_ip(inicio, final)!= 0)
    {
         print(ip_to_string(inicio));
         incrementa_ip(inicio);
    }

    return 0;
}

um exemplo de implementação da função 'ip_to_string':

#include <sstream>

string ip_to_string(IP_t ip)
{
std::stringstream s;

    s << ip.o1 << '.' ip.o2 << '.' << ip.o3 << '.' << ip.o4;
    return s.str(); 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se isso ajudar:

 

#include <string>
#include <sstream>
#include <iostream>
#include <vector>
using namespace std;

vector<int> splitIP(string s, char c) {

int octeto_atual = 0;
int inicio = 0;
int posicao_separador = 0;
int placeholder;

vector<int> octetos;
octetos.reserve(4);

while( inicio < s.length() && (posicao_separador = s.find('.', inicio )) != string::npos) {
	istringstream tmps(s.substr(inicio, posicao_separador));
	tmps >> placeholder;
	octetos.push_back(placeholder);
	inicio = posicao_separador + 1;
	octeto_atual++;
}

istringstream final(s.substr(inicio, s.length()));
final >> placeholder;
octetos.push_back(placeholder);

return octetos;
}



void listaIP(vector<int>ipInicial, vector<int> ipFinal) {
int idx1[4] = {ipInicial.at(0), ipInicial.at(1), ipInicial.at(2), ipInicial.at(3)};

while(idx1[0] != ipFinal.at(0) || idx1[1] != ipFinal.at(1) || idx1[2] != ipFinal.at(2) || idx1[3] != ipFinal.at(3)) {
	idx1[3] = (idx1[3] + 1)%256;
	idx1[2] = (idx1[3] == 0)? (idx1[2] + 1)%256 : idx1[2];
	idx1[1] = (idx1[2] == 0 && idx1[3] == 0)?(idx1[1] + 1)%256 : idx1[1];
	idx1[0] = (idx1[1] == 0 && idx1[2] == 0 && idx1[3] == 0)? (idx1[0] + 1)%256 : idx[0];

	cout << idx1[0] << '.' << idx1[1] << '.' << idx1[2] << '.' << idx1[3] << endl;
} 
}

int main() {
string IP_inicial = "";
string IP_final = "";

cout << "Digite o ip inicial: ";
getline(cin, IP_inicial);

cout << "Digite o ip final: ";
getline(cin, IP_final);

if (!IP_inicial.compare(IP_final)) {
	cout << "Não existem ips nessa faixa." << endl;
} else {
	vector<int> ipInicial = splitIP(IP_inicial,'.');
	vector<int> ipFinal = splitIP(IP_final, '.');

	listaIP(ipInicial, ipFinal);
}
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.