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

Problema al printar en Sockets

Estas en el tema de Problema al printar en Sockets en el foro de C/C++ en Foros del Web. Necessito una ayudita. Estoy haciendo una aplicacion cliente/servidor con sockets y estoy en un punto que necesito consultar los dominios de una marca. Estoy haciendo ...
  #1 (permalink)  
Antiguo 11/03/2013, 11:01
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 4 meses
Puntos: 0
Problema al printar en Sockets

Necessito una ayudita.

Estoy haciendo una aplicacion cliente/servidor con sockets y estoy en un punto que necesito consultar los dominios de una marca.

Estoy haciendo pruebas y me pasa una cosa rara.

El cliente envia el nombre de la marca y el server la recibe, hasta aqui todo bien. Para comprobar que llega lo correcto hago un print en el server y verdaderamente imprime lo correcto.

Entonces con la variable que tiene la marca que quiero consultar llamo a una funciona que se llama "consultar marca" y aqui es donde viene el problema

La cuestion es que dentro de esa funcion hago otro print para ver si se me printa lo que he he pasado por parametreo dentro de la función, el problema es que la primera vez no se printa pero la segunda si y asi sucesivamente. Es decir que la funcion es llamada cada 2 veces, es una cosa muy rara.

Haber si me podeis echar un cable.

El CLIENTE:
Código c:
Ver original
  1. while(opcio!=7){
  2.     printa_menu();
  3.     // Obtenim la opcio introduida per l'usuari
  4.     scanf("%d",&opcio);
  5.     printf("\n\n");
  6.  
  7.     bzero(buffer, sizeof(buffer));            
  8.  
  9.     switch(opcio){
  10.  
  11.                 // Opció HELLORQ OK!!
  12.         case 0: stshort(1,buffer); //Posem el codi de operacio al buffer
  13.                 sendto(sockClient, buffer, tamany_tshort, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  14.                 bytes_rebuts= recvfrom(sockClient, buffer, sizeof(buffer), 0, (struct sockaddr*)&client, &client_t);
  15.                 printf("%d\n",bytes_rebuts );
  16.                 printf("%s\n", buffer+tamany_tshort); //Printem per patalla ell hello world
  17.                 break;
  18.  
  19.                 //Opcio LlistRQ mostrem la llista dels bookmarks OK!!
  20.         case 1: stshort(3,buffer); //Posem el codi de operacio al buffer
  21.                 sendto(sockClient, buffer, tamany_tshort, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  22.                 bzero(buffer, sizeof(buffer));
  23.                 bytes_rebuts= recvfrom(sockClient, buffer, sizeof(buffer), 0, (struct sockaddr*)&client, &client_t);
  24.                 printMarkTableFromAnArrayOfBytes(buffer+tamany_tshort, bytes_rebuts); //Funcio per printar els bookmarks, fem +tamany_buffer per eliminar el codi de operacio
  25.                 break;
  26.  
  27.         case 2: stshort(6, buffer);
  28.                 printf("\nIntrodueix la marca que vols consulta: \n");
  29.                 scanf("%s",&marca_consulta);
  30.                 tamany_buffer=strlen(marca_consulta);
  31.                 strcpy(buffer+tamany_tshort,marca_consulta);
  32.                 tamany_buffer=tamany_buffer+tamany_tshort;
  33.                 sendto(sockClient, buffer, tamany_buffer, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  34.                
  35.                 printf("\n buffer= %s",buffer+2);
  36.                 break;

Es el case 2, os pongo todo el case haber si el problema viene de otro lado

Y el SERVIDOR:
Código c:
Ver original
  1. void consultarMarca(char marca[100], struct _markTable* taula_de_Marques )
  2. {
  3.  
  4.  
  5.   printf("Despues de la funcion:  %s", marca);
  6.  
  7. }
  8.  
  9.  
  10. while(1)
  11.   {      
  12.           bzero (buffer, sizeof(buffer));
  13.           bytes_rebuts = recvfrom(sockServer, buffer,sizeof(buffer),0, (struct sockaddr*)&server, &server_t);
  14.          
  15.           if (bytes_rebuts== -1)
  16.           {
  17.              printf("Error al rebre dades, bytes rebuts= %d\n\n", bytes_rebuts);
  18.           }
  19.  
  20.          
  21.         switch(ldshort(buffer))
  22.         {
  23.           //Enviem el hello world OK!!!!!!!!!!
  24.           case 1:     bzero(buffer, sizeof(buffer));
  25.                       stshort(2,buffer);
  26.                       strcpy(buffer+t_short,"HELLO WORLD");
  27.                       tamany_buffer=t_short+strlen(buffer+1);
  28.                       sendto(sockServer, buffer, tamany_buffer, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  29.                       break;
  30.  
  31.                       //Enviem la taula de marques OK!!!!!!
  32.           case 3:       bzero(buffer, sizeof(buffer)); //Buidem el buffer
  33.                       stshort(4,buffer); //Posem el codi de operacio al buffer
  34.                       memcpy(buffer+t_short,markTable_to_byteArray,tamany_markTable); //Copiem al buffer, la taula de marques indicant el seu tamany
  35.                       sendto(sockServer, buffer, tamany_markTable, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  36.                       break;
  37.  
  38.                       //Consulta d'una marca
  39.           case 6:     printf("\nAntes de la funcion %s\n",buffer+2 );
  40.                      
  41.                       consultarMarca(buffer+2,markTable);
  42.                       bzero (buffer, sizeof(buffer));
  43.                       break;
  44.  
  45.  
  46.         }
  47.      
  48. }
  49.  
  50.  
  51.   return 0;  
  52. }
  #2 (permalink)  
Antiguo 11/03/2013, 11:13
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problema al printar en Sockets

Si pongo la llamada justo antes del recive si que funciona correctamente.
Es decir si hago esto

Código c:
Ver original
  1. bytes_rebuts = recvfrom(sockServer, buffer,sizeof(buffer),0, (struct sockaddr*)&server, &server_t);
  2.           consultarMarca(buffer+2,markTable);

Tambien me he dado cuenta de que si hago un print de algo despues tambien me funciona.

es decir asi :

Código c:
Ver original
  1. case 6:     printf("\nAntes de la funcion %s\n",buffer+2 );
  2.                      
  3.                       consultarMarca(buffer+2,markTable);
  4.                       printf("Si pongo esto si que se printa bien");
  5.  
  6. bzero (buffer, sizeof(buffer));
  7.                       break;

Es como si la primera vez se guardara una linia vacia.

Última edición por Macas; 11/03/2013 a las 11:32

Etiquetas: funcion, int, lista, sockets, variable
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 10:48.