Klient gg - fork()

0

Mam do napisania klienta gg na bazie api z ekg - w postaci jak <ort>najprostrzej</ort>, w moim wypadku klient przy uruchamianiu odbiera 3 argumenty: <nasze_haslo> <nasz_numer> <numer_osoby_do_pogadania>

W jakis sposob musze rozwiazac jednoczesne pisanie wiadomosci i odbieranie owych w trkcie pisania (badz nie)

W kodzie wrzucilem fork() podzielilem to tak aby proces potomny obieral tresci, a rodzic bral na siebie cala reszte, wyglada to tak

/*

Kompilator: gcc

Wymagane biblioteki: libgadu

Testowane na: Knoppix Live 4.0.2

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "libgadu.h"

int main(int argc, char **argv)
{
    struct gg_session *sess;
    struct gg_event *e;
    struct gg_login_params p;

    if (argc < 4) {
        fprintf(stderr, "uzycie: %s <haslo> <numergg> <numerek>\n", argv[0]);
        return 1;
    }

    gg_debug_level = 0; // Bylo 255

    memset(&p, 0, sizeof(p));
    p.uin = atoi(argv[2]);
    p.password = argv[1];

    p.status = GG_STATUS_BUSY;

    if (!(sess = gg_login(&p))) {
        printf("Nie udalo sie polaczyc: %s\n", strerror(errno));
        gg_free_session(sess);
        return 1;
    }

    printf("\n================================\n");
    printf("\n Polaczono z serwerem Gadu-Gadu\n\n");
    printf("================================\n\n");
    printf("Tworzenie procesow potomnych\n\n"); 

    //Status zajety

    gg_change_status(sess, GG_STATUS_BUSY);

    int pid;

    switch(pid = fork())
    {
        //Niepowodzenie
        case -1:
            printf("Nie udalo sie stworzyc procesu potomnego, zakonczenie dzialania programu");
            exit(0);
        break;

        //Dziecko - wypisuje otrzymane/wyslane wiadomosci
        case 0:
            printf("Tworzenie okna rozmowy\n");

            while(1)
            {               
                if (!(e = gg_watch_fd(sess)))
                {
                    printf("Po³±czenie przerwane: %s\n", strerror(errno));
                    gg_logoff(sess);
                    gg_free_session(sess);
                    return 1;
                }   

                if(e->type == GG_EVENT_MSG && e->event.msg.sender == atoi(argv[3]))
                {                   
                    printf("\n/-- %d napisal(a):\n", e->event.msg.sender);
                    printf("%s\n", e->event.msg.message);
                    printf("\\---------------------\n\n");
                    /* e->event.msg.class mówi czy rozmowa czy wiad. */
                    /* je?li e->event.msg.sender równy 0, to mamy */
                    /* wiadomo?? systemow? o numerze w msg.class */
                    gg_event_free(e);
                }   
            }

        break;

        //Rodzic - konsola, przyjmuje pisany przez nas tekst
        default:
            printf("Tworzenie konsoli\n\n\n");

            char s[160];

            while(1)
            {
                printf(">> ");
                fflush(stdout);
                fgets(s, 160, stdin);
                printf("\n");

                if (!(e = gg_watch_fd(sess)))
                {
                    printf("Po³±czenie przerwane: %s\n", strerror(errno));
                    gg_logoff(sess);
                    gg_free_session(sess);
                    return 1;
                }

                if (gg_send_message(sess, GG_CLASS_MSG, atoi(argv[3]), s) == -1)
                {
                    printf("Polaczenie przerwane: %s\n", strerror(errno));
                    gg_free_session(sess);
                    return 1;
                }

                switch (e->type)
                {
                    case GG_EVENT_NONE:
                    case GG_EVENT_PONG:
                        gg_ping(session);
                        break;

                    case GG_EVENT_ACK:
                        printf("wiadomosc dotar?a do %d.\n", e->event.ack.recipient);
                        /* e->event.ack.status mówi czy dotar?a do klienta */
                        /* czy le?y na serwerze, sta?e GG_ACK_... */
                        /* e->event.ack.seq to numerek wiadomo?ci */
                        gg_event_free(e);
                        break;
                }

            }

        break;
    }

    gg_logoff(sess);
    gg_free_session(sess);

    return 0;
}

Problem polega na tym ze po uruchomieniu proces potomny przejmuje (?) konsole systemowa - zatem moje pytanie - co musze tu zrobic aby proces potomny sobie dzialal i wyswietlal przychodzace wiadomosci a rodzic odbieral to co wpisze ?

Z gory dzieki za help

0

Przeczytaj:

http://www.mimuw.edu.pl/~mengel/PW/PUBLIC-PW/03_pipe/

Pomiędzy syna, a ojcem musisz stworzyć łącze nienazwane(pipe). Najlepiej zrobić to jak w pliku parent_dup.c (zamknąć standardowe deskrytory i za pomocą dup przekierować łącze w jego miejsce)

0

pozwole sobie odkopac temat. Czy ktokolwiek uporal sie juz z tym problemem i moglby to jakos jasniej wytlumaczyc? Mecze sie z tym ciagle i mimo wskazowek nie dziala to tak, jako byc powinno

0

tak.

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