Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Tomar cadena automatica

Estas en el tema de Tomar cadena automatica en el foro de C/C++ en Foros del Web. Estimados. Tengo un pequeño problema, estoy desarrollando un socket UDP que me permita escuchar a través de un puerto y que al momento de recibir ...
  #1 (permalink)  
Antiguo 17/11/2010, 14:10
 
Fecha de Ingreso: noviembre-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Exclamación Tomar cadena automatica

Estimados.

Tengo un pequeño problema, estoy desarrollando un socket UDP que me permita escuchar a través de un puerto y que al momento de recibir una cadena (100 caracteres aprox.) esta sea guardada en un archivo txt para que luego esta cadena se tome y sea procesada recorriendo el arreglo y tomando sus valores para que sean guardados en una base de datos.

Mi problema pasa que cuando uno generalmente hace un programa en C siempre el usuario es el que ingresa los valores por consola, pero yo no deseo eso, sino que deseo que de manera automática esta sea leída y guardada.

tengo el código que me permite conectarme al puerto, a su vez tengo el código que me permite crear un archivo .txt pero mi problema va en que no se cual comando es el que me permite tomar la cadena y que esta se almacene en el txt.

recibe cadena

por lo general siempre se usa el pero esta necesariamente depende de que el usuario este ingresando la cadena lo cual no me sirve.
Código:
scanf("%s",cadena);

Estaba usando el comando:
Código:
fprintf(archivo, %cadena);
en donde archivo se llama mi archivo.txt y que es un puntero

Espero me echen una mano, si desean les adjunto mi código.

Última edición por cris7ian; 17/11/2010 a las 14:18
  #2 (permalink)  
Antiguo 17/11/2010, 14:48
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Tomar cadena automatica

A ver...del UDP escribis en el archivo y despues queres que otro programa, o funcion, lea ese archivo.

con el fprintf deberia funcionar. Estas usando open antes de leer??
  #3 (permalink)  
Antiguo 17/11/2010, 15:15
 
Fecha de Ingreso: noviembre-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Tomar cadena automatica

este es mi código. lo que deseo es que escriba en el archivo.txt la cadena que recibe del puerto, pero automático (este es el socket de servidor nomas porque pq mi puerto esta abierto ese sera mi cliente, este es el que queda escuchando al puerto)
que tengo mal




Código:
/*
 * ConectorUDP.c
 *
 */


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 25558 /* El puerto que sera abierto */
#define BACKLOG 2 /* El numero de conexiones permitidas */

main()
{

   int fd, fd2; /* los ficheros descriptores */
   FILE *archivo; // puntero

   struct sockaddr_in server;   /* para la informacion de la direccion del servidor */
   struct sockaddr_in client;   /* para la informacion de la direccion del cliente */

   int sin_size;

   /* A continuaci�n la llamada a socket() */
   if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
      printf("error en socket()\n");
      exit(-1);
   }

   server.sin_family = AF_INET;

   server.sin_port = htons(PORT); /* le doy el puerto =) */

   server.sin_addr.s_addr = INADDR_ANY; /* asigna IP*/

   bzero(&(server.sin_zero),8); /* escribimos ceros en el reto de la estructura */


   /* llamada a bind() */
   if(bind(fd,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1) {
      printf("error en bind() \n");
      exit(-1);
   }

   if(listen(fd,BACKLOG) == -1) {  /* llamada a listen() */
      printf("error en listen()\n");
      exit(-1);
   }

   while(1) {
      sin_size=sizeof(struct sockaddr_in);    /* llamada a accept() */
      if ((fd2 = accept(fd,(struct sockaddr *)&client, &sin_size))==-1) {
         printf("error en accept()\n");
         exit(-1);
      }
      /*abrimos el archivo y lo escribimos mediante 'a' si no existe lo crea*/

      					archivo=fopen("ConexionUDP.txt", "a");
               	         /*Si no lo logramos abrir, salimos*/
      						if(archivo==NULL)
      							{
      								printf ("No se puede abrir el archivo...");
      								return 1;
      							}

      					/*Escribimos en el archivo*/
               	        fprintf(archivo, &sin_size);


               	        /*Cerramos el archivo*/
               	        fclose(archivo);
               	        return 0;

      printf("mensaje del equipo: %s\n", inet_ntoa(client.sin_addr) );
 

      close(fd2); /* cierra fd2*/

   }// fin while

}// fin main
  #4 (permalink)  
Antiguo 17/11/2010, 17:20
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 14 años, 1 mes
Puntos: 9
Respuesta: Tomar cadena automatica

Cita:
Iniciado por cris7ian Ver Mensaje
este es mi código. lo que deseo es que escriba en el archivo.txt la cadena que recibe del puerto, pero automático (este es el socket de servidor nomas porque pq mi puerto esta abierto ese sera mi cliente, este es el que queda escuchando al puerto)
que tengo mal




Código:
/*
 * ConectorUDP.c
 *
 */


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 25558 /* El puerto que sera abierto */
#define BACKLOG 2 /* El numero de conexiones permitidas */

main()
{

   int fd, fd2; /* los ficheros descriptores */
   FILE *archivo; // puntero

   struct sockaddr_in server;   /* para la informacion de la direccion del servidor */
   struct sockaddr_in client;   /* para la informacion de la direccion del cliente */

   int sin_size;

   /* A continuaci�n la llamada a socket() */
   if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
      printf("error en socket()\n");
      exit(-1);
   }

   server.sin_family = AF_INET;

   server.sin_port = htons(PORT); /* le doy el puerto =) */

   server.sin_addr.s_addr = INADDR_ANY; /* asigna IP*/

   bzero(&(server.sin_zero),8); /* escribimos ceros en el reto de la estructura */


   /* llamada a bind() */
   if(bind(fd,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1) {
      printf("error en bind() \n");
      exit(-1);
   }

   if(listen(fd,BACKLOG) == -1) {  /* llamada a listen() */
      printf("error en listen()\n");
      exit(-1);
   }

   while(1) {
      sin_size=sizeof(struct sockaddr_in);    /* llamada a accept() */
      if ((fd2 = accept(fd,(struct sockaddr *)&client, &sin_size))==-1) {
         printf("error en accept()\n");
         exit(-1);
      }
      /*abrimos el archivo y lo escribimos mediante 'a' si no existe lo crea*/

      					archivo=fopen("ConexionUDP.txt", "a");
               	         /*Si no lo logramos abrir, salimos*/
      						if(archivo==NULL)
      							{
      								printf ("No se puede abrir el archivo...");
      								return 1;
      							}

      					/*Escribimos en el archivo*/
               	        fprintf(archivo, &sin_size);


               	        /*Cerramos el archivo*/
               	        fclose(archivo);
               	        return 0;

      printf("mensaje del equipo: %s\n", inet_ntoa(client.sin_addr) );
 

      close(fd2); /* cierra fd2*/

   }// fin while

}// fin main


*En primera el socket que estas creando es para una conexion TCP, no UDP. si necesitas una conexion UDP cambia la macro SOCK_STREAM por SOCK_DGRAM
*Tu fprintf esta mal, le estas pasando un int en lugar de un const char *format.
*En ningun momento estas leyendo informacion de tu socket
*Te falta incluir la libreria strings.h para poder hacer uso de la funcion bzero


En fin, leete un buen manual de sockets. Para leer informacion de un socket existen las funciones recv y read. Informate un poquito mas y si te van saliendo dudas concretas hasmelas saber.

Bienvenido a la programacion de sockets :E

Saludos++
  #5 (permalink)  
Antiguo 19/11/2010, 09:31
 
Fecha de Ingreso: noviembre-2010
Mensajes: 9
Antigüedad: 14 años
Puntos: 0
Respuesta: Tomar cadena automatica

Cita:
Iniciado por Trovaz Ver Mensaje
*En primera el socket que estas creando es para una conexion TCP, no UDP. si necesitas una conexion UDP cambia la macro SOCK_STREAM por SOCK_DGRAM
*Tu fprintf esta mal, le estas pasando un int en lugar de un const char *format.
*En ningun momento estas leyendo informacion de tu socket
*Te falta incluir la libreria strings.h para poder hacer uso de la funcion bzero


En fin, leete un buen manual de sockets. Para leer informacion de un socket existen las funciones recv y read. Informate un poquito mas y si te van saliendo dudas concretas hasmelas saber.

Bienvenido a la programacion de sockets :E

Saludos++



Estimado gracias por tus comentarios. se que tengo un error con el tema de que reciba la cadena, las funciones recv las vi en un manual pero no logro entenderlas, posees un ejemplo que me aclare el cuento

Etiquetas: tomar, automatico, cadenas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:17.