• Viernes 15 de Noviembre de 2024, 11:07

Autor Tema:  Error En Recv Y En El Send  (Leído 832 veces)

pepe123

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Error En Recv Y En El Send
« en: Sábado 8 de Julio de 2006, 04:02 »
0
Te comento el problema, igualmente léelo cuando puedas, no hay problema.

El tema es el siguiente, tengo un proceso ciudad y varios procesos equipo. Cuando se levanta la ciudad hacemos un select con un tiempo determinado para esperar a que se levanten los equipos, mientras que se levantan, los equipos son guardados en una lista. La lista es enviada a cada equipo según corresponda y el equipo juega. El método de juego es bastante tonto también. Lo que hace es recibir de la ciudad la lista de equipos, mientras que no se el mismo juega. El pedido de juego es, el equipo1 le pide a la ciudad jugar contra el equipo2, la ciudad le dice al equipo2 que le levante y el equipo2 le responde OK. Cuando el equipo2 le responde OK a la ciudad, la ciudad le pasa los datos del equipo2 al equipo1 para que puedan jugar.

 

Ahora te planteo el problema. El problema que estoy teniendo es que cuando le toca jugar el último partido al ultimo equipo de la lista a la ciudad no le llega a la ciudad el send que hace el equipo. Hice un strace para ver si le manda algo y el equipo hace el send perfectamente, es mas hice 2 send seguidos y el segundo lo recibe bien la ciudad pero el primero no. Otra prueba que hice fue cambiar de lugar los send, o sea en la prueba anterior le mandaba el mensaje de jugar y luego basura, ahora le mando basura y luego jugar, pero la ciudad sigue sin recibir el msg. Verifique que la cantidad de bytes sea la correcta y estaba todo bien. Es mas pensando que sea un problema de sincronización de procesos empecé a usar semáforos, pero al parecer tampoco era ese el problema.

 

Disculpa tanta informacion de golpe, pero ya no tengo ni idea y encima debe ser un error muy tonto, despues mando las medialuna o lo que quieras.

 

Te paso el pedazo de código de la ciudad y del equipo para que veas, igualmente es bastante básico.

Este es un pedazo del código de la ciudad cuando hace la recepción de los msg:

/*----------------------------------------------------------*/

Código: Text
  1. if (mandar != -1){
  2.  
  3.                         while (strncmp(buf, "Lev", 3) != 0){
  4.  
  5.                               printf ("MAIN - Estoy antes del Select\n");
  6.  
  7.                               DescriptoresALeer = BolsaMaestra;
  8.  
  9.                               printf ("MAIN - Semaforo de la ciudad ANTES de modificar - %d\n", SemRead(1));
  10.  
  11.                               deseosemaforo (1, 1);
  12.  
  13.                               printf ("MAIN - Semaforo de la ciudad DESPUES de modificar - %d\n", SemRead(1));
  14.  
  15.                               SE = select (FdMax + 1, &DescriptoresALeer, NULL, NULL, NULL);
  16.  
  17.                               if (SE == -1){
  18.  
  19.                                     logg('Z',4,"Error en el Select");
  20.  
  21.                                     printf("Ciudad - Error en el Select\n");
  22.  
  23.                                           return 0;
  24.  
  25.                               }
  26.  
  27.                               for (i = 0; i <= FdMax; i++){
  28.  
  29.                                     if (FD_ISSET (i, &DescriptoresALeer)){    // tenemos datos!!
  30.  
  31.                                           if (i == ciudadsock){
  32.  
  33.                                                 if ((NvoFd =  accept (i, NULL,  NULL)) == -1){
  34.  
  35.                                                       logg('Z',4,"Error en el accept");
  36.  
  37.                                                 }else {
  38.  
  39.                                                       FD_SET(NvoFd, &BolsaMaestra); // añadir al conjunto maestro
  40.  
  41.                                                       if (NvoFd > FdMax) {    // actualizar el máximo
  42.  
  43.                                                             FdMax = NvoFd;
  44.  
  45.                                                       }
  46.  
  47.                                                       logg('Z',2,"Se conecto alguien");
  48.  
  49.                                                 }
  50.  
  51.                                           }else{
  52.  
  53.                                                 if ((nbytes = recv(i,buf,sizeof(buf),0))==-1){
  54.  
  55.                                                       sprintf(mensaje, "Error al recibir datos por el socket");
  56.  
  57.                                                       logg('Z',4,mensaje);
  58.  
  59.                                                       return -1;
  60.  
  61.                                                 }
  62.  
  63.                                                 else {
  64.  
  65.                                                       printf ("MAIN - El buffer - %s\n", buf);
  66.  
  67.                                                       memset(&aux, '\0', 1024);
  68.  
  69.                                                       strcpy (aux, buf);
  70.  
  71.                                                       switch (interprete(buf)){
  72.  
  73.  
  74.  

/*----------------------------------------------------------*/

 

Este es un pedazo del código del equipo cuando hace el envió de los msg:

Código: Text
  1. while(lista) {
  2.  
  3.                   if (strncmp(lista->Equipo, equipo, 16) != 0){
  4.  
  5.                         //Pedido de juego
  6.  
  7.                         printf ("PROGRMAR PARTIDO - Encontro el equipo y empezo el tema del pedido\n");
  8.  
  9.                         printf ("PROGRMAR PARTIDO - Verifico de tener recursos con el semaforo\n");
  10.  
  11.                         /**Variables de Samaforo**/
  12.  
  13.                         printf ("PROGRMAR PARTIDO - El valor del semaforo ciudad de juego ANTES - %d \n", SemRead(1));
  14.  
  15.                         while (SemRead(1) != 1);
  16.  
  17.                         printf ("PROGRMAR PARTIDO - El valor del semaforo ciudad de juego DESPUES - %d \n", SemRead(1));
  18.  
  19.                         SemDown(1);
  20.  
  21.                         sleep (3);
  22.  
  23.                         memset(&buf, '\0', 1024);
  24.  
  25.                         memset(&mensaje, '\0', 1024);
  26.  
  27.                         sprintf (mensaje, "El equipo %s quiere jugar contra %s", equipo, lista->Equipo);
  28.  
  29.                         logg('E',2,mensaje);
  30.  
  31.                         printf ("El equipo %s quiere jugar contra %s\n", equipo, lista->Equipo);
  32.  
  33.                         sprintf (buf, "Jugar %s", lista->Equipo);
  34.  
  35.                         printf ("PROGRMAR PARTIDO - Le envio a la ciudad el pedido de juego - %s\n", buf);
  36.  
  37.                         if (send(ciudad, &buf, sizeof(buf), 0) == -1){
  38.  
  39.                                     logg('E',4,"Equipo - Error en el send");
  40.  
  41.                                     exit(1);
  42.  
  43.                         } else {
  44.  
  45.                               logg('E',2,"Equipo - Se enviaron datos por el socket");
  46.  
  47.                         }
  48.  
  49.                         if (send(ciudad, “Esta mierda no funciona”, sizeof(buf), 0) == -1);
  50.  
  51.                         if (recv(ciudad, &buf, sizeof(buf), 0) == -1){
  52.  
  53.                               logg('E',4,"Equipo - Error en el recv");
  54.  
  55.                               exit(1);
  56.  
  57.                         }
  58.  
  59.                         memset(&mensaje, '\0', 1024);
  60.  
  61.                         strcpy (mensaje, buf);
  62.  
  63.                         printf ("PROGRMAR PARTIDO - Recibio una respuesta de la ciudad - %s\n", mensaje);
  64.  
  65.                         if (strncmp (mensaje, "OK", 2) == 0){ //ok <ip> <puerto>
  66.  
  67.                         //Inicia el juego
  68.  
  69.  


/*----------------------------------------------------------*/

De paso te mando una parte del strace de la ciudad y del equipo para que veas que el equipo le manda el msg a la ciudad y la ciudad no se da por aludida.

 

Strace de la Ciudad

 

write(1, "Pasamos la lev a un nuevo equipo"..., 33) = 33 (La lev es la lista de equipos visitantes)

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semctl(720896, 0, IPC_64|GETVAL, 0xbfaf5a78) = 1

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semctl(720896, 0, IPC_64|GETVAL, 0xbfaf5a78) = 1

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semop(720896, 0xbfaf5aa2, 1)            = 0

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semctl(720896, 0, IPC_64|GETVAL, 0xbfaf5a78) = 0

send(4, "LEV\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\363\4\0\0\0\0\0\0"..., 1024, 0) = 1024

recv(4, "OK\0\0\0\0\0\0\0\22\1\0\0\0\0\0\0\1\0\0\0LEV\0\0\0\0\0"..., 1024, 0) = 1024

send(4, "equipo3\0\0\0\0\0\0\0\0\0`\341\4\10I\t\2\0\0\0\0\0\0\0"..., 1024, 0) = 1024

send(4, "equipo1\0\0\0\0\0\231\16\2\0\220\346\4\10\21\0\0\0\300"..., 1024, 0) = 1024

send(4, "equipo2\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\0equipo3\0"..., 1024, 0) = 1024

time(NULL)                              = 1151896703

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

open("Ciudad.02072006", O_RDWR|O_APPEND|O_CREAT, 0666) = 8

fstat64(8, {st_mode=S_IFREG|0644, st_size=2587, ...}) = 0

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f15000

write(8, "111823[INFO]Le envio el mensaje "..., 70) = 70

close(8)                                = 0

munmap(0xb7f15000, 4096)                = 0

*****************send(4, "fin\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024, 0) = 1024*****************

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semctl(720896, 0, IPC_64|GETVAL, 0xbfaf5a78) = 0

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semctl(720896, 0, IPC_64|GETVAL, 0xbfaf5a78) = 0

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semop(720896, 0xbfaf5aa2, 1)            = 0

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semctl(720896, 0, IPC_64|GETVAL, 0xbfaf5a78) = 1

select(8, [3 4 5 6 7], NULL, NULL, NULL) = 1 (in [4])

*****************recv(4, "Esta mierda no funciona\0Equipo -"..., 1024, 0) = 1024*****************

*****************write(1, "El BUF : Esta mierda no funciona"..., 33) = 33*****************

 

Strace del Equipo

 

recv(3, "LEV\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\363\4\0\0\0\0\0\0"..., 1024, 0) = 1024

time(NULL)                              = 1151896703

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

open("Equipo.02072006", O_RDWR|O_APPEND|O_CREAT, 0666) = 4

fstat64(4, {st_mode=S_IFREG|0644, st_size=274, ...}) = 0

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f4a000

write(4, "111823[INFO]Se recibio un dato\n", 31) = 31

close(4)                                = 0

munmap(0xb7f4a000, 4096)                = 0

time(NULL)                              = 1151896703

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

open("Equipo.02072006", O_RDWR|O_APPEND|O_CREAT, 0666) = 4

fstat64(4, {st_mode=S_IFREG|0644, st_size=305, ...}) = 0

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f4a000

write(4, "111823[INFO]Comenzo la funcion P"..., 50) = 50

close(4)                                = 0

munmap(0xb7f4a000, 4096)                = 0

send(3, "OK\0\0\0\0\0\0\0\22\1\0\0\0\0\0\0\1\0\0\0LEV\0\0\0\0\0"..., 1024, 0) = 1024

recv(3, "equipo3\0\0\0\0\0\0\0\0\0`\341\4\10I\t\2\0\0\0\0\0\0\0"..., 1024, 0) = 1024

recv(3, "equipo1\0\0\0\0\0\231\16\2\0\220\346\4\10\21\0\0\0\300"..., 1024, 0) = 1024

recv(3, "equipo2\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\0equipo3\0"..., 1024, 0) = 1024

*****************recv(3, "fin\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024, 0) = 1024*****************

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semctl(720896, 0, IPC_64|GETVAL, 0xbfc2c088) = 1

semget(1001, 1, 0666)                   = 720896

semget(1001, 1, 0666)                   = 720896

semop(720896, 0xbfc2c0b2, 1)            = 0

rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0

rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

nanosleep({3, 0}, {3, 0})               = 0

write(1, "El equipo equipo1 quiere jugar c"..., 46) = 46

*****************write(1, "El buffer es: Jugar equipo2\n", 28) = 28*****************

*****************send(3, "Jugar equipo2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024, 0) = 1024*****************

time(NULL)                              = 1151896706

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1267, ...}) = 0

open("Equipo.02072006", O_RDWR|O_APPEND|O_CREAT, 0666) = 4

fstat64(4, {st_mode=S_IFREG|0644, st_size=355, ...}) = 0

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f4a000

write(4, "111826[INFO]Equipo - Se enviaron"..., 53) = 53

close(4)                                = 0

munmap(0xb7f4a000, 4096)                = 0

*****************send(3, "Esta mierda no funciona\0Equipo -"..., 1024, 0) = 1024*****************