Autor
|
Tema: Hacer Ping en codigo C y que cree un txt con los resultados de cada IP (Leído 10,639 veces)
|
rubia28
Desconectado
Mensajes: 17
|
Buenas tardes a todos, Estoy realizando un trabajo y necesito crear un programa que aparte de abrir, leer, modificar y crear archivos .txt haga un ping y esta información la almacene en un nuevo txt. He conseguido crear el archivo .txt desde cmd haciendo ping directamente, pero no soy capaz de codificar el código en el programa de C para que el programa directamente ejecute el ping y guarde la información en un nuevo .txt ¿Podéis ayudarme? Tengo que crear las siguientes funciones y no sé por donde empezar 1. Una función que lea el contenido de un archivo .txt con diferentes direcciones ip, en la que la ruta del archivo se solicitará al usuario por pantalla. La ruta y nombre del archivo tienen que ser preguntados al usuario y visualizados por pantalla. Por último, el programa debe lanzar un ping para cada una de las direcciones ip del archivo e informar cuales de ellas responden correctamente a este comando. Mil gracias por la ayuda, saludos.
|
|
|
En línea
|
|
|
|
Danielㅤ
Desconectado
Mensajes: 1.680
🔵🔵🔵🔵🔵🔵🔵
|
Hola, y dónde está tu código?, mostranos el código que tenés creado hasta ahora, si no tenes nada hecho, entonces primero estudia, aprende y ahí volve de nuevo a dejarnos el código, porque ahora no has dejado ningún código y solo nos has comentado del programa que debes hacer y el enunciado. Por otro lado para almacenar la salida/respuesta del ping, podes usar este comando: ping 192.168.1.1 -t > filename.txt Más info https://www.enmimaquinafunciona.com/pregunta/47363/guardar-ping-de-salida-en-un-archivo-de-textoSaludos
|
|
« Última modificación: 17 Noviembre 2020, 17:44 pm por [D]aniel »
|
En línea
|
|
|
|
rubia28
Desconectado
Mensajes: 17
|
Hola!
El código que tengo hasta ahora mismo es este;//Función que muestra por pantalla el contenido del archivo cuya ruta ha introducido el usuario cuando se le ha requerido. #include <string.h> #include <stdio.h> #include <stdlib.h> //Macro definida para insertar saltos de línea durante el codigo para mejorar el aspecto visual de la impresión de los printf por pantalla. #define println() printf("\n") void leerArchivo(); void ArrancarPing() int main(void){ int opcion; printf("Seleccione la opción que desea realizar: \n\n" "a. Una función que lea el contenido de un archivo .txt con diferentes direcciones ip, en la que la ruta del archivo se solicitará al usuario por pantalla. La ruta y nombre del archivo tienen que ser preguntados al usuario y visualizados por pantalla. Por último, el programa debe lanzar un ping para cada una de las direcciones ip del archivo e informar cuales de ellas responden correctamente a este comando." "b. Sin desarrollar.\n\n" "c. Sin desarrollar.\n\n" "d. Salir del programa. \n\n"); while (opcion != 'a' && opcion != 'A' && opcion != 'b' && opcion != 'B' && opcion != 'c' && opcion != 'C' && opcion != 'd' && opcion != 'D') { printf("Opción incorrecta, eliga una de las opciones disponibles. (a,b,c o d).\n"); } switch (opcion) { case 'a': case 'A': leerArchivo(); break; case 'b': case 'B': printf("Prueba de funcionamiento opcion B\n"); break; case 'c': case 'C': printf("Prueba de funcionamiento opcion C\n"); break; case 'd': case 'D': break; } return 0; } void leerArchivo(){ //Declaración de puntero tipo FILE FILE *f; //Declaración de variables locales char archivo[80]; //La variable archivo es la ruta asignada a la variable f de tipo fichero. printf("\n Introduce la ruta del archivo a leer: \n"); println(); scanf("%s", &archivo ); //Lectura de la cadena introducida por el usuario mediante scanf, los datos introducidos pasan a corresponder a la variable archivo. println(); //Asignamos al puntero f la apertura del archivo cuya ruta está almacenada en la variable "archivo", utilizamos el modo de apertura de lectura ("r"). if (f == NULL) { printf("Problemas de apertura del archivo\n"); //Si la variable f de tipo fichero tiene valor NULL, es decir, no ha logrado abrir el archivo, se imprime por pantalla un mensaje de error. } //En los otros casos, es decir, si se ha conseguido la apertura correcta del archivo de la ruta introducida... else { while (!feof(f )) { //Mientras no se ha llegado al final del fichero "f"... printf("%c", getc(f )); //Imprime por pantalla el carácter que está leyendo el fichero en ese mismo instante, de esta forma, imprime todos los carácteres, mostrando por pantalla todos los carácteres que contiene el archivo de texto. } fclose(f ); //Cerramos el archivo para liberar recursos. } } void ArrancarPing(){ char command[50]; strcpy( command , "ping www.google.com" ); }
He conseguido abrir el archivo .txt y que me muestre las IP que tengo en el archivo, pero no soy capaz de ejecutar el ping cogiendo la información del archivo que he abierto y leido por pantalla.., solo he conseguido ejecutar el ping desde el código escribiendo una IP concreta en el mismo
Mil gracias por la ayuda, saludos. MOD: El código debe ir entre etiquetas de Código GeSHi
|
|
« Última modificación: 18 Noviembre 2020, 01:22 am por K-YreX »
|
En línea
|
|
|
|
ThunderCls
Desconectado
Mensajes: 455
Coder | Reverser | Gamer
|
Si quieres procesar cada IP en el fichero puedes hacerlo de dos formas: 1- Como lo estas haciendo, leyendo el contenido del fichero en una funcion antes de procesar cada IP 2- Leer cada entrada en el fichero y posteriormente procesarla en la misma funcion
El tema con la primera es que vas a necesitar almacenar el contenido del fichero en memoria (estatica o dinamica) si quieres mas adelante (otra funcion) procesar cada IP. Con la segunda opcion no necesitas guardar el contenido en memoria ya que lo lees y al momento lo procesas antes de leer la siguiente entrada
Por otra parte, para poder acceder a la salida o resultado del comando que estas ejecutando puedes usar "pipes", en este caso la funcion "popen()" en lugar de "system()", la cual te crea automaticamente una via de comunicacion con la aplicacion ejecutada y te ofrece un stream para que puedas leer su salida o resultado. Luego ya es solo comprobar que el resultado sea el esperado.
Saludos
|
|
|
En línea
|
|
|
|
rubia28
Desconectado
Mensajes: 17
|
El problema, es que una vez he llegado aquí no he conseguido avanzar más.. consigo ver la información de las IP que tengo en el fichero .txt y he conseguido que el programa me cree un nuevo .txt con la respuesta que da el ping poniendo una dirección.. pero no sé como declarar la función para poder hacerla como indicas en el paso 2 que sería lo más lógico y funcional creo.
Lo máximo ha sido crear estas dos funciones.void leerArchivo(){ //Declaración de puntero tipo FILE FILE *f; //Declaración de variables locales char archivo[80]; //La variable archivo es la ruta asignada a la variable f de tipo fichero. printf("\n Introduce la ruta del archivo a leer: \n"); println(); scanf("%s", &archivo ); //Lectura de la cadena introducida por el usuario mediante scanf, los datos introducidos pasan a corresponder a la variable archivo. println(); //Asignamos al puntero f la apertura del archivo cuya ruta está almacenada en la variable "archivo", utilizamos el modo de apertura de lectura ("r"). if (f == NULL) { printf("Problemas de apertura del archivo\n"); //Si la variable f de tipo fichero tiene valor NULL, es decir, no ha logrado abrir el archivo, se imprime por pantalla un mensaje de error. } //En los otros casos, es decir, si se ha conseguido la apertura correcta del archivo de la ruta introducida... else { while (!feof(f )) { //Mientras no se ha llegado al final del fichero "f"... printf("%c", getc(f )); //Imprime por pantalla el carácter que está leyendo el fichero en ese mismo instante, de esta forma, imprime todos los carácteres, mostrando por pantalla todos los carácteres que contiene el archivo de texto. } fclose(f ); //Cerramos el archivo para liberar recursos. } } void arrancarPing(){ char command[50]; strcpy(command , "ping www.google.com""> ping2.txt" ); return 0; }
Mil gracias, saludos. MOD: El código debe ir entre etiquetas de Código GeSHi
|
|
« Última modificación: 18 Noviembre 2020, 01:24 am por K-YreX »
|
En línea
|
|
|
|
ThunderCls
Desconectado
Mensajes: 455
Coder | Reverser | Gamer
|
Tu funcion "arrancarPing" podria ser algo como: void arrancarPing(const char* ip) { char command[255] = {0}; sprintf(command , "ping %s > ping2.txt", ip ); }
y la usarias justo despues de leer una linea (suponiendo que cada ip este contenida en una linea por separado) del fichero const int MAX_IP_LEN = 40; char ip[MAX_IP_LEN] = {0} while (fgets(ip , MAX_IP_LEN , f )) { arrancarPing(ip); }
|
|
|
En línea
|
|
|
|
rubia28
Desconectado
Mensajes: 17
|
Buenos días, Lo primero de todo, darte las gracias por tu ayuda, por más que busco y pruebo no soy capaz de dar con lo que se me pide.. He probado a añadir en el código lo que me indicas y me da error en la línea 9, está claro que es porque estoy haciendo algo mal, pero no consigo ver que es lo que está sin inicializar como me indica el programa. Me avisa con estos fallos; [Warning] excess elements in array initializer [Warning] (near initialization for 'ip') Sobre la línea char ip[MAX_IP_LEN] = {0};
No descarto haber colocado mal las líneas en el código.. //Función que muestra por pantalla el contenido del archivo cuya ruta ha introducido el usuario cuando se le ha requerido. void leerArchivo(){ //Declaración de puntero tipo FILE FILE *f; //Declaración de variables locales char archivo[80]; //La variable archivo es la ruta asignada a la variable f de tipo fichero. const int MAX_IP_LEN = 40; char ip[MAX_IP_LEN] = {0}; printf("\n Introduce la ruta del archivo a leer: \n"); println(); scanf("%s", &archivo ); //Lectura de la cadena introducida por el usuario mediante scanf, los datos introducidos pasan a corresponder a la variable archivo. println(); //Asignamos al puntero f la apertura del archivo cuya ruta está almacenada en la variable "archivo", utilizamos el modo de apertura de lectura ("r"). f = fopen(archivo , "rt"); if (f == NULL) { printf("Problemas de apertura del archivo\n"); //Si la variable f de tipo fichero tiene valor NULL, es decir, no ha logrado abrir el archivo, se imprime por pantalla un mensaje de error. } //En los otros casos, es decir, si se ha conseguido la apertura correcta del archivo de la ruta introducida... else { while (!feof(f )) { //Mientras no se ha llegado al final del fichero "f"... printf("%c", getc(f )); //Imprime por pantalla el carácter que está leyendo el fichero en ese mismo instante, de esta forma, imprime todos los carácteres, mostrando por pantalla todos los carácteres que contiene el archivo de texto. } while (fgets(ip , MAX_IP_LEN , f )) { arrancarPing(ip); } fclose(f ); //Cerramos el archivo para liberar recursos. } } void arrancarPing(const char* ip){ char command[255] = {0}; sprintf(command , "ping %s > ping2.txt", ip ); }
Mil gracias por la ayuda, saludos.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.696
🏴 Libertad!!!!!
|
Yo en lo personal nunca delegaba el trabajo a herramientas del sistema y nunca las llamaría por "system(......)" y aunque ese código posiblemente funcione es ineficiente. void arrancarPing(const char* ip) { char command[255] = {0}; sprintf(command , "ping %s > ping2.txt", ip ); }
Es de lo más ineficiente que existe. Mi recomendación es que no utilices ese código, ya que te cierra la mente a otras posibilidades. Yo en lo personal dependiendo del sistema operativo buscaría la librería exacta de mi sistema para realizar ping de forma nativa, es decir buscaría como generar paquetes ICMP directamente desde código fuente. En windows https://docs.microsoft.com/en-us/windows/win32/api/icmpapi/nf-icmpapi-icmpsendecho En linux: https://www.geeksforgeeks.org/ping-in-c/FreeBSD https://github.com/freebsd/freebsd/blob/master/sbin/ping/ping.cEsto te sirve mucho por que aprendes a programar para un sistema u otro y también sirve por que aprenderias como funciona el protocolo ICMP. Saludos!
|
|
|
En línea
|
|
|
|
rubia28
Desconectado
Mensajes: 17
|
Muchas gracias Alberto por los recursos compartidos, me han parecido bastante interesantes. El problema es que el programa que se me plantea realizar tiene que hacerse si o si desde C y tiene que leer las IP desde el archivo .txt y mostrar en pantalla si funcionan correctamente o no lanzando un ping con cada una de las líneas que hay en el archivo de texto. Me estoy volviendo loca para poder dar con un código funcional que pueda hacer esto, porque por más que busco info y leo los recursos que tengo no he visto nada similar, ni como poder realizar algo parecido.. Lo único que encontré para poder realizar el ping, fue este ejemplo: #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char command[50]; return(0); }
Sacado de esta página https://www.tutorialspoint.com/c_standard_library/c_function_systemY partiendo de este ejemplo, modificar el "ls -l" por el "ping", pero solo he conseguido que haga el ping si pongo una dirección concreta, no soy capaz de que utilice las lineas del archivo .txt y me diga si las IP funcionan correctamente o no Mil gracias a todos por vuestra ayuda, me está sirviendo de mucho para ir problando otras posibilidades y ver que puedo hacer porque veo que estoy estancada ahora mismo...
|
|
|
En línea
|
|
|
|
Danielㅤ
Desconectado
Mensajes: 1.680
🔵🔵🔵🔵🔵🔵🔵
|
Hay varias formas de hacer eso, podes usar popen: http://lsi.vc.ehu.es/pablogn/docencia/manuales/SO/funciones.php.htmlLa función popen(). Permite "abrir" otro ejecutable para ejecutarlo y leer su salida o enviarle datos de entrada. También podes usar una página web que haga ese trabajo... de esa manera no usarás recursos de tu sistema ni el comando system, podes usar una web sencilla que haga el ping y lea la respuesta HTML de ese ping, por ejemplo aquí tenés una web: https://ping.eu/ping/acabo de hacer un ping a una IP de Google y devolvió lo siguiente: -- PING 216.58.207.228 (216.58.207.228) 56(84) bytes of data. --- 64 bytes from 216.58.207.228: icmp_seq=1 ttl=115 time=31.7 ms 64 bytes from 216.58.207.228: icmp_seq=2 ttl=115 time=31.7 ms 64 bytes from 216.58.207.228: icmp_seq=3 ttl=115 time=31.7 ms 64 bytes from 216.58.207.228: icmp_seq=4 ttl=115 time=31.7 ms
--- 216.58.207.228 ping statistics ---
packets transmitted 4 received 4 packet loss 0 % time 3009 ms
--- Round Trip Time (rtt) ---
min 31.714 ms avg 31.726 ms max 31.741 ms mdev 0.009 ms
cómo verás devolvió todo lo que necesitas... y además de no usar los servicios de tu sistema, el contenido HTML es muy pequeño, por lo que es muy fácil obtener solo los datos que necesitas exactamente. Aquí tenés el subprocess.popen (python) in C: https://stackoverflow.com/questions/17196877/subprocess-popen-python-in-c/17198078#17198078Saludos
|
|
« Última modificación: 18 Noviembre 2020, 14:52 pm por [D]aniel »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[VBS] crear un menu y que en cada opsion cree un bay y lo ejecute
Scripting
|
mick_1918
|
1
|
6,206
|
24 Febrero 2009, 04:35 am
por Novlucker
|
|
|
Uno de cada 8 usuarios no cree en ciberamenazas
Noticias
|
wolfbcn
|
0
|
1,231
|
15 Noviembre 2014, 01:52 am
por wolfbcn
|
|
|
Uno de cada cuatro internautas españoles cree que es importante estar siempre...
Noticias
|
wolfbcn
|
0
|
1,297
|
26 Junio 2016, 22:02 pm
por wolfbcn
|
|
|
Cómo hacer para que un código de C++ se ejecute cada X tiempo automáticamente
Programación C/C++
|
nadales56
|
9
|
5,224
|
8 Marzo 2019, 08:57 am
por nadales56
|
|
|
codigo script para hacer ping en php
« 1 2 »
Scripting
|
condorito
|
15
|
22,613
|
2 Julio 2022, 14:55 pm
por Danielㅤ
|
|