Programa em C/Cpp

15 respostas
K

Boa noite,

Objetivo:

Estou tentando preparar uma parte de um sistema de analise de rede; praticamente todo sistema, será feito em Java. Uma pequena parte; como os testes de ping, gostaria de implementar em C/Cpp.

Problema:

Faz alguns dias que estou procurando; como ler e analisar a saida, do comando: ping -n 3 x.x.x.x; dentro do programa escrito em C, mas, não encontrei como fazê-lo.

Alguém pode me passar alguma coisa a respeito?

Obrigado.

Abraço.

15 Respostas

D

KaosBr:
Boa noite,

Objetivo:

Estou tentando preparar uma parte de um sistema de analise de rede; praticamente todo sistema, será feito em Java. Uma pequena parte; como os testes de ping, gostaria de implementar em C/Cpp.

Problema:

Faz alguns dias que estou procurando; como ler e analisar a saida, do comando: ping -n 3 x.x.x.x; dentro do programa escrito em C, mas, não encontrei como fazê-lo.

Alguém pode me passar alguma coisa a respeito?

Obrigado.

Abraço.

cpp é apenas uma extensão comum de arquivos de código fonde c++ que costuma conter declarações completas das funções membro de classes.

pode utilizar a função system para fazer chamadas de comando do SO e gravar as saídas das execuções dos comando em arquivos intermediários, por exemplo, você pode executar o comando ping 192.168.0.64 >> arquivoPing.log e manipular o arquivo para trabalhar com o resultado da execução do comando do SO.

K

Oba,

Pois é, o executavel em C, já foi testado. Ele executa o teste, através da função: sytem(“ping x.x.x.x”); a saida é exibida no monitor, cheguei a testar com um redirecionamento da saida, conforme exemplo abaixo:

system(“ping x.x.x.x > ping.log”);

O redirecionamento; funciona bem, cheguei a verificar como manipular arquivos em C, a princípio não pareceu complicado a implementação. Porém, gostaria de processar a saida do comando o quanto antes; pulando inclusive os procedimentos, de redirecionamento de saida em arquivo e sua leitura posterior.

A forma mais rápida para processamento; ao meu ver, acabou sendo:

  • O armazenamento; da saida do comando, em memoria.
  • O processamento; ainda em memoria, das informações retornadas.

Justamente o que não consegui encontrar referências; para implementar, em C ou C++. A solução pode ser implementada; conforme os dois tópicos acima, ou, a única solução vai ser através de gravação e leitura de arquivo?

Obrigado.

Abraço.

D

Pelo que conheço de C++ existe uma biblioteca que trabalha com fluxo pegando respostas do SO, se não me engano é a dirent.h, mas caso entenda mais de c dependendo da plataforma que estiver utilizando utilize dos próprios codigos objetos no SO.

K

Obrigado pela ajuda.

Vou pesquisar essa biblioteca: dirent.h, para verificar como pode ser feito. Agora tenho por onde começar, caso acerte a implementação; posto, o codigo no tópico.

Um grande abraço.

V

Se pode ser em C++ as melhores alternativas são:

a) usar a boost process:
http://www.netbsd.org/~jmmv/process/boost_process/usage.html#boost_process.usage.interprocess_communication

b) A parte de comunicação entre processos da POCO:

Outra coisa. Não existe um programa em C/C++. Ou ele é em C, ou em C++.
São duas linguagens completamente diferentes.

R

ViniGodoy:
Não existe um programa em C/C++. Ou ele é em C, ou em C++.
São duas linguagens completamente diferentes.

Não manjo muito de c/c++, mas me sentido tentado a perguntar. Um arquivo com extensão cpp que contém uma classe com algumas funções que utilizam funções incluídas de cabeçalhos com extensão .h, está em c ou c++?

V

Se tem classe está em cpp.

Entretanto, para um programa estar em C++ mesmo, você precisa cumprir alguns requisitos de codificação. Um problema atual é que muita gente ainda programa C++ como se fazia em 1980 ou, pior do que isso, faz uma mistureba de C++ com C sem entender o que está fazendo direito.
Reformulando sua pergunta para o mundo Java: “Um programa em Java que não use nenhuma sintaxe de generics e faça uso da AWT, está em Java 7?”

Então, talvez esse programa (por ter classes) esteja em C++. Mas se ele ainda faz uso dos .h do C, mal faz uso de classes, não usa a STL, não sabe o que é templates, e nem tem qualquer noção do que um método const signifique, entre outras coisas, provavelmente está implementado num C++ bem antigo e ultrapassado.

V

Aliás, aproveitando o tópico, gostaria de citar um trecho da filosofia que o C++ tem beeem diferente do Java:
C++ is designed to give the programmer choice, even if this makes it possible for the programmer to choose incorrectly

Ou seja, no caso do C++, a linguagem irá reclamar pouco se você optar por usar más práticas. Na verdade, ela não reclama nada.
Fazer um código moderno cabe exclusivamente ao programador. O Java, em muitos aspectos, tenta proteger você de fazer um mau código.

O C++, não. Ele assume que o programador sabe exatamente o que está fazendo.

É claro que o que eu disse não é 100% verdade. O C é um subset do C++ e você pode misturar as duas linguagens. Mas a comunidade C++ gosta de ressaltar que hoje as duas linguagens são bastante diferentes, pois do ponto de vista de práticas de programação, são dois mundo completamente distintos. Mistura-se hoje C com C++ apenas por questões de interoperabilidade e, dizer que as duas são “quase a mesma coisa” é como falar que o Java é quase igual ao C++, só porque existe o JNI e porque a sintaxe é parecida.

A prática do C++ inclui uso de smart pointers (na verdade, de um paradigma chamado de RAII), forte uso de templates, o uso correto do conceito de constness, uso de referências e bibliotecas de alto nível, como a STL e a boost. Se você nunca ouviu falar de nada disso, é porque provavelmente está programando como se fazia lá no início da era de informática. É como programar em Java desprezando toda a API e só usando o que o java.lang tem a oferecer.

A

Por curiosidade, qual é o seu sistema operacional?

V

Você perguntou pra quem? Foi pro dono do tópico?
Se foi para mim, o meu é o Windows 7 Home Premium em casa, XP no trabalho e Vista no Notebook.

A

Você perguntou pra quem? Foi pro dono do tópico?
Se foi para mim, o meu é o Windows 7 Home Premium em casa, XP no trabalho e Vista no Notebook.

Foi para o autor do tópico. Se não me engano, com sockets da biblioteca (sys/socket, netinet/in, sys/types, e etc.) padrão ele implementa tudo isso aí.

K

Boa noite, desculpem a demora cheguei em casa agora.

Andre Rosa,

Windows Vista Home Premium

Gostei da idéia é possivel implementar? Onde encontro material, caso fique inviável nesse caso especifico, é sem dúvida um bom objeto para estudo e uso em outros casos. Talvez até mesmo nesse caso, em adaptações futuras, pode ser em C ou C++.

ViniGodoy,

Aprecio muito seus comentários; inclusive me recordei de um onde, você me passou um link com normas de desenvolvimento. Você conhece algum com as convenções de C++?

Pessoal, obrigado por todas as postagens; foram bem recebidas, até mais.

Um grande abraço.

A

KaosBr:
Boa noite, desculpem a demora cheguei em casa agora.

Andre Rosa,

Windows Vista Home Premium

Gostei da idéia é possivel implementar? Onde encontro material, caso fique inviável nesse caso especifico, é sem dúvida um bom objeto para estudo e uso em outros casos. Talvez até mesmo nesse caso, em adaptações futuras, pode ser em C ou C++.

Neste caso, você não usaria esses arquivos cabeçalhos que citei, pois eles pertencem aos sistemas UNIX. No seu caso, você deverá usar a Winsock.h, se quiser mesmo fazer tudo “na mão”, através de sockets.

K

Andre Rosa,

Entendi, tomei nota das bibliotecas; para estudo, e posterior uso.

Obrigado.

Abraço.

V

André, que eu me lembre, não é tão trivial assim fazer através de sockets. O problema é que o ping é um comando do protocolo ICMP, que roda abaixo do TCP e parelelo ao IP. Portanto, os sockets comuns não os enviam. Você precisa envia-lo por raw socket, e isso implica em implementar quase tudo o que vai embaixo do ICMP.

Dei uma procurada por ICMP e Winsock no google e confirmei minha suspeita:
http://tangentsoft.net/wskfaq/examples/rawping.html

De qualquer forma, eu evitaria usar a WinSock ou a sock.h, e usaria no lugar a boost::asio (abaixo vai um exemplo do ping na própria documentação da asio):
http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/example/icmp/ping.cpp

Não só é consideravelmente mais simples, como também é multiplataforma. E assim não mistura tanto código C com código C++.

Kaos, se quiser saber de boas práticas em C++, o melhor caminho é ler o livro Effective C++. Não é à toa que ele é o primeiro a ser citado no meu roadmap:
http://pontov.com.br/site/cpp/46-conceitos-basicos/88-roadmap-c

Procure também conhecer bem o funcionamento da STL e da Boost. Ambas são excelentes bibliotecas, com muita, muita, muita coisa já pronta para você trabalhar.

Criado 28 de julho de 2011
Ultima resposta 29 de jul. de 2011
Respostas 15
Participantes 5