Przesyłanie struktury przez IPC

0

Witam. Mam problem a mianowicie jak przesłać strukturę przez kolejkę komunikatów IPC ?

Klient:

struct Message
{
    long mtype; // pid servera
    struct Player *p;
};

void connect(int msgid, struct Player *p)
{
    struct Message m;
    m.mtype = 1;
    strcpy(p->buffer, "JOIN");
    m.p = p;
    printf("Wskazuje na : %ld\n", &m.p);
    printf("WIADOMOSC: TYP: %ld PID %d STATUS %s\n", m.mtype, m.p->pid, m.p->buffer);
    sendMsg(msgid, m);
}



struct Player player;
    initialPlayer(&player);
    printf("INICJALIZACJA [OK]\n");
    connect(msgid, &player);

server

struct Message msg;

    while(1)
    {
      
        if(msgrcv(msgid, &msg, sizeof(struct Message), 1, 0) <= 0)
            continue;

        printf("Odebrano : %s\n",msg.p->buffer); // TUTAJ Naruszenie ochrony pamięci (zrzut pamięci)

Jak widać po odebraniu na serwerze dostaje Naruszenie ochrony pamięci (zrzut pamięci) (gdy chce odczytac dane z playera).
Gdy odczytuje mtype to działa (więc jakby nie przesyłało playera)...

0

Problem objawia się dopiero po odebraniu wiadomości jednak przyczyna błędu jest jeszcze przed jej wysłaniem.
W strukturze Message masz wskaźnik na strukturę Player i po przypisaniu mu wartości w funkcji connect po prostu wysyłasz strumień bajtów.
Czym jednak jest wskaźnik na Player? Liczbą, adresem w pamięci.
To co wysyłasz jest numerem wskazującym na miejsce w którym znajduje się struktura Player, nic więcej. Nie wysyłasz struktury Player.

Co powinineś zrobić? Na przykład zamiast wskaźnika na Player w strukturze Message stworzyć zmienną typu'struct Player' do którego kopiujesz całą strukturę Player którą chcesz wysłać.
Możesz też stworzyć bufor wyjściowy (tablica char'ów) do którego najpierw kopiujesz strukturę Message, a tuż za nią Player. Jest pewnie jeszcze kilka rozwiązań, ale te wydają się najprostsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1