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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.