Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/02/2011, 10:01
pekinlol
 
Fecha de Ingreso: febrero-2011
Mensajes: 1
Antigüedad: 13 años, 2 meses
Puntos: 0
Comunicación mediante sockets RAW (cliente-servidor)

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

Código:
#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

Código:
#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!!