От новичка до гуру: Курсы программирования на CyberDuff

как читать динамическое сообщение в очереди сообщений

Мне нужно отправить сообщение не определенного размера, и чтобы вторая программа отображала размер полученного сообщения, выделяла под него память, принимала и печатала

моя первая программа ждет, пока пользователь введет сообщение, выделяет для него память и отправляет размер сообщения другой программе, а затем отправляет само сообщение.

моя вторая программа получает сообщение с размером сообщения, которое придет, но при этом не получает само сообщение и я не понимаю, как решить эту проблему

прог 1. отправитель

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <stdlib.h>


struct msgbuf
{
long type;
char mtext[1];
};

struct size
{
long type;
char sz[1];
};

  void send_message(int mqid)
 {
char mes[1000];
struct msgbuf *buffer;
struct size buf;
buf.type = 1;
int length;

//memset(buffer.mtext, 0, sizeof(buffer.mtext));

for(int i = 0; i < 4;i++){

    fgets(mes, sizeof(mes), stdin);
    sprintf(buf.sz, "%ld", strlen(mes));
    length = strlen(mes)+1;
    if(msgsnd(mqid, &buf,sizeof(buf.sz), 0)<0)
        perror("msgsnd");
    printf("Size: %d\n",strlen(mes));
    buffer = malloc(sizeof(struct msgbuf)-1 + length);
    buffer->type = 2;
    strncpy(buffer->mtext, mes, strlen(mes));
    if(msgsnd(mqid, &buffer, length, 0)<0)
        perror("msgsnd");
    else
        printf("Send message: %s\n", buffer->mtext);

    //free(buffer);

}
}

 int main()
 {
int key = ftok("comm", 8);
if(key < 0)
    perror("ftok");

int id = msgget(key, 0600);
if(id < 0)
    perror("msgget");

send_message(id);

return 0;
 }

программа 2

#include <stdio.h>
   #include <string.h>
   #include <sys/ipc.h>
   #include <sys/msg.h>
   #include <sys/types.h>
   #include <stdlib.h>


   struct msgbuf
   {
    long type;
    char mtext[1];
   };

   struct size
   {
    long type;
    char sz[1];
   };



void receive_message(int mqid)
{
    struct msgbuf *buffer;
    struct size szbuf;
    int a;

    for(int i = 0; i < 4;i++){
        if(msgrcv(mqid, &szbuf, sizeof(szbuf.sz), 1,0)<0)
                        perror("msgrcv");
        else
            printf("Size: %s\n", szbuf.sz);

        printf("Hello\n");

        a = atoi(szbuf.sz);
        printf("%d\n", a);

        /*szbuf = (struct size*) malloc(sizeof(struct size) - 1 + a);
        if(msgrcv(mqid, szbuf, sizeof(szbuf->sz), 2,0)<0)
                        perror("msgrcv");
                else
                        printf("Size: %s\n", szbuf->sz);*/

        struct msgbuf* buffer = (struct msgbuf*)malloc(sizeof(struct msgbuf)-1 + a);
        if(msgrcv(mqid, buffer, sizeof(buffer->mtext), 2,0)<0)
            perror("msgrcv");
        else
            printf("Received message: %s\n", buffer->mtext);

        free(buffer);


    }
   }

   int main()
   {
    int key = ftok("comm", 8);
    if(key < 0)
        perror("ftok");

    int id = msgget(key, 0600|IPC_CREAT|IPC_EXCL);
    if(id < 0)
        perror("msgget");

    receive_message(id);

    if(msgctl(id, IPC_RMID, 0)<0)
        perror("msgctl");

    return 0;
   }

программа-получатель должна распечатать размер входящего сообщения и само сообщение


  • Я не могу найти ничего плохого в вашем коде. Один совет: нет необходимости использовать прототип, упомянутый на справочной странице msgsnd,msgrcv. Вы можете объявить mtext любого размера и предотвратить некоторые сложные malloc, вычисления 05.11.2019

Ответы:


1

Ваш случай может использовать сокет ipc, может проверить пик сообщения (также быть размером сообщения), затем выделить память и выполнить реальный прием.

15.11.2019
Новые материалы

Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

Отслеживание состояния с течением времени с дифференцированием снимков
Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

Игра в прятки с данными
Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

«Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

Все о кейсах: Camel, Snake, Kebab & Pascal
В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..