Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - PeKiN

#1
Hola! me gustaría saber si existen funciones o mecanismos para detectar fácilmente si, en una conexión mediante sockets TCP, se ha perdido la conexión por caida repentina o cierre del otro extremo. Seria una situación del estilo Servidor con varios Clientes, los Clientes se conectan y se registran en una base de datos y quedan conectados. El problema surge si se pierde la conexión de forma fortuita con el cliente (un corte de luz en el cliente, por ejemplo), qué forma sencilla y eficaz podría implementarse para detectar y eliminar al cliente de dicho registro.

Un saludo!
#2
Programación C/C++ / Temporizador en C
8 Junio 2011, 12:26 PM
Hola! me gustaría añadir a mi programa una solución para el siguiente problema. Se conectan y registran varios servidores (en una base de datos mysql), pero en el caso de que alguno caiga de forma fortuita, se queda como registrado y eso seria un error. Lo único que se me ocurre es comprobar periódicamente si ese servidor sigue vivo, ¿qué herramienta (función, método, etc..) podría utilizar para resolver este problema en C?

Gracias de ante mano

Saludos
#3
Programación C/C++ / lapsus con punteros
29 Mayo 2011, 23:38 PM
Hola! he tenido un problema muy básico con punteros y me gustaría que alguien me ilustrara práctica y teóricamente para quitarme las dudas.

Una función pedía como argumento un puntero y yo hice lo siguiente:

int *a;
funcion(a);


Y me daba violación de segmento.

Sin embargo, luego lo puse así:

int a;
funcion(&a);


Y ya funcionaba correctamente. Entiendo que el puntero, al declararlo, no apunte a nada y por eso al llamar la función no puede escribir nada. En el segundo caso, al declarar la variable, sí que reservo un espacio de memoria cuya direccion al obtenerla "&a" es como si fuera su propio puntero, apuntando a un destino ya existente, por eso puede escribir la función en esa variable y no hay error.
¿Es esto así?

Gracias de ante mano.
#4
Redes / Netfilter, iptables y tablas NAT
8 Abril 2011, 15:49 PM
Hola!! Tengo entendido que en general, los routers hacen un "nateo" automático, haciendo traduccion de direcciones de red. Una máquina línux, mediante el módulo netfilter, puede hacer de router y es posible configurar una tabla NAT con ciertas reglas, de modo que hariamos un "nateo" manual, ¿esto es correcto?
#5
Hola! queria saber si existe alguna forma para comunicar dos procesos hijo en C, intercambiando informacion entre ellos una vez ejecutados.

Gracias de ante mano
#6
Hola!! Necesito comunicar dos sockets de tipo RAW, uno como cliente y otro como servidor. Teóricamente debe ser algo muy sencillo, pero no doy con mi fallo. Aquí expongo el código que utilizo para el cliente y el servidor:

cliente.c


#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <linux/if_ether.h>

int main (int argc, char *argv[]){

  int sock_cli, longitud, n;
  struct sockaddr_in dir_serv;

  sock_cli = socket (AF_INET, SOCK_RAW, IPPROTO_RAW);
  if (sock_cli < 0){
    printf("Error en la funcion socket() \n");
    exit(1);
  }
  bzero(&dir_serv, sizeof(dir_serv));
  dir_serv.sin_family = AF_INET;
  dir_serv.sin_port=htons(4000);
  dir_serv.sin_addr.s_addr=htonl(INADDR_ANY);

  longitud = sizeof (dir_serv);

  n = sendto(sock_cli, "prueba raw", 256, 0, (struct sockaddr *) &dir_serv, sizeof(dir_serv));
  if (n == -1){
    printf("Error en sendto() \n");
    exit(1);
  }
  printf("Valor de n: %d \n", n);

  close(sock_cli);

  exit(0);


}


Aparentemente, el cliente hace su sendto() correctamente, sin embargo, en el servidor..

servidor.c


#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <string.h>

int main (int argc, char *argv[]){

  int sock_serv, sock_cli, rbind, n;
  socklen_t longitud;
  struct sockaddr_in dir_serv, cliaddr;
  char buff[256];

  sock_serv = socket (AF_INET, SOCK_RAW, IPPROTO_RAW);
  if (sock_serv < 0){
    printf("Error en la funcion socket() \n");
    exit(1);
  }

  bzero(&dir_serv, sizeof(dir_serv));
  dir_serv.sin_family = AF_INET;
  dir_serv.sin_port=htons(4000);
  dir_serv.sin_addr.s_addr=htonl(INADDR_ANY);

  longitud = sizeof(dir_serv);

  rbind = bind(sock_serv, (struct sockaddr *) &dir_serv, longitud);
  if (rbind == -1){
    printf("Error en la funcion bind() \n");
    exit(1);
  }
  printf("Voy a ejecutar recvfrom() \n");
  n = recvfrom(sock_serv, buff, 256,0,(struct sockaddr *) &cliaddr, &longitud);
  if (n > 0){
    printf("He recibido algo\n");
  }
  printf("Valor de n: %d\n", n);
  close (sock_serv);

exit(1);
}


El programa se queda esperando en recvfrom() algo que nunca le llega.
Aparte de que las pruebas las hago en el propio PC (para que no falle por causas externas), he probado a cambiar la signatura de la función socket por la de UDP, ya que el código serviría "socket (AF_INET, SOCK_DGRAM, 0)" y me he encontrado con que la comunicación se produce correctamente y se recibe en el servidor. Sin embargo en RAW me falla, ¿alguien me echa una mano?

Gracias y saludos!!