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