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

mq_send, ERRNO 97. Msg too long.

Estas en el tema de mq_send, ERRNO 97. Msg too long. en el foro de C/C++ en Foros del Web. Hola, Tengo una aplicación que pide port eclado un entero y lo encola en una cola que previamente se ha abierto. Al hacer el ms_send ...
  #1 (permalink)  
Antiguo 06/06/2016, 06:27
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
mq_send, ERRNO 97. Msg too long.

Hola,

Tengo una aplicación que pide port eclado un entero y lo encola en una cola que previamente se ha abierto. Al hacer el ms_send me obtengo el error de mensaje demasiado largo y no soy capaz de descubrir el problema ya que a simple vista los tamaños parecen correctos.


Código:
#include <stdio.h> 
#include <mqueue.h>
#include <errno.h>

mqd_t queueDescriptor;
#define QUEUE_NAME "/POENK_SENDER_RECEIVER"
#define QUEUE_SIZE 100 /* bytes */

int message;
#define MSG_SIZE   4 


void openQueueForWritting()
{
     struct mq_attr attributes;
     
	 attributes.mq_flags = 0;  /* Only this can be modified at mq_open */
	 attributes.mq_maxmsg = 10;  
	 attributes.mq_msgsize = MSG_SIZE;  
	 attributes.mq_curmsgs = 0; 
        
     queueDescriptor = mq_open(QUEUE_NAME, O_CREAT |O_WRONLY, 0777, &attributes);
     
     if (queueDescriptor < 0)
     {
           printf("\n[ ERROR opening the queue! ]\nError: %d. %s\n", errno, strerror (errno));   
     }
     else
     {
           printf("\n[ Queue opened successfully! ] Descriptor: %d\n", queueDescriptor);
     }
}

void sendMessage()
{   
	 if (0 != mq_send(queueDescriptor,(char *)message, MSG_SIZE, 0)) /* Last value is the priority */
	 {
         printf("\n      [ERROR sending the message]\n      Error: %d. %s\n", errno, strerror (errno));
     }
     else
     {
         printf("\n      [Message sent to the queue]\n");    
     }
}

int main(void)
{
     printf("#########################################\n");
     printf("#                                       #\n");
     printf("#        SENDER process running ...     #\n");
     printf("#                                       #\n");
     printf("#########################################\n");
     
     openQueueForWritting();
      
     while (1)
     {
          printf("\n# Type the integer to transmit: ");
          scanf("%d", &message); 

          sendMessage();
     }
     
     return 0;    
}
  #2 (permalink)  
Antiguo 06/06/2016, 07:15
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: mq_send, ERRNO 97. Msg too long.

Cita:
Iniciado por Zunri Ver Mensaje
y no soy capaz de descubrir el problema ya que a simple vista los tamaños parecen correctos.
Pues yo, a simple vista, no veo donde están correctos los tamaños ni donde verificas la entrada del teclado. Estás enviando como longitud de la cadena la constante MSG_SIZE en lugar de usar un sizeof de lo que has leído por teclado.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 06/06/2016, 07:47
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: mq_send, ERRNO 97. Msg too long.

Fijandote un poco puedes ver que el tamaño de un int son 4 bytes, que es el tamaño de la constante MSG_SIZE, a simple vista.
  #4 (permalink)  
Antiguo 06/06/2016, 08:16
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: mq_send, ERRNO 97. Msg too long.

De acuerdo al estándar, el tipo int puede ocupar 2 bytes o 4 bytes, luego asumir que siempre va a ocupar 4 bytes puede ser perjudicial para tus intereses.

Por otro lado también te digo que dudo mucho que en un pc el compilador genere ints de 2 bytes.

Hasta donde llego viendo documentación por internet, la forma de crear la cola en el cliente (el que envia) debería ser algo tal que:

Código C:
Ver original
  1. queueDescriptor = mq_open(QUEUE_NAME, O_WRONLY);

Lo cual difiere ligeramente de tu código:

Código C:
Ver original
  1. struct mq_attr attributes;
  2.  
  3. attributes.mq_flags = 0;  /* Only this can be modified at mq_open */
  4. attributes.mq_maxmsg = 10;
  5. attributes.mq_msgsize = MSG_SIZE;
  6. attributes.mq_curmsgs = 0;
  7.  
  8. queueDescriptor = mq_open(QUEUE_NAME, O_CREAT |O_WRONLY, 0777, &attributes);

No se si los tiros irán por ahí, ya que no tengo un linux a mano y en casa tampoco podré probarlo en una temporadita porque mi placa base murió durante el fin de semana con solo 3 añitos de vida :(

Da la impresión de que puedes estar creando la cola dos veces. Piensa que uno de los extremos es el que crea la cola y el otro extremo simplemente se une a dicha cola.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 06/06/2016, 15:49
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: mq_send, ERRNO 97. Msg too long.

Muchas gracias por la respuesta! Lo probaré mañana

Etiquetas: char, int
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 12:35.