[C] gniazda BSD: prosta aplikacja klient-serwer

0

witam!
projekt wyglada tak: klient wysyła żądanie do serwera, ten je przetwarza i wysyła wyniki. Oto mój kod:

SERWER:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void obsluz(FILE * strumien, char * buf)  {
	printf("zadanie klienta %s", buf);		
	fputs("OK!", strumien);			
	fflush(strumien);
}

int main(int argc, char * argv[]) {
	int z;
	unsigned int port;						/*port serwera*/
	struct sockaddr_in serwer_adres; 				/*adres serwera*/
	struct sockaddr_in klient_adres;				/*adres serwera*/

	int dlugosc;							/*dlugosc adresu serwera/klienta*/
	int serwer_gniazdo;						/*gniazdo serwera*/
	int klient_gniazdo;						/*gniazdo klienta*/
	int sesja_gniazdo;						/*gniazdo polaczenia*/
	char bufor[128];

	FILE * odczyt = NULL;						/*strumien odczytu*/
	FILE * zapis = NULL;						/*strumien zapisu*/


		if (argc >= 2) {
			port = atoi(argv[1]);				/*port pobrany z linii polecen*/
		}
		else {
			printf("Na jakim porcie nasluchiwac?");
			scanf("%u", &port);
		}

		if ((serwer_gniazdo = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
			printf("blad socket()");
		return 1;
		}

		memset(&serwer_adres, 0, sizeof(serwer_adres));

	/*tworzenie adresu serwera*/
	serwer_adres.sin_family = AF_INET;
	serwer_adres.sin_port = ntohs(port);
	serwer_adres.sin_addr.s_addr = inet_addr("127.0.0.1");

	dlugosc = sizeof(serwer_adres);

	/*wiazanie adresu z gniazdem*/
	if (bind(serwer_gniazdo, (struct sockaddr *) &serwer_adres, dlugosc) == -1) {
		printf("blad bind()\n");
	return 1;
	}

	/*nasluchiwanie*/
	if ((z = listen(serwer_gniazdo, 10)) == -1  )  {
		printf("blad listen()");
	return 1;
	}

	for (;;) {
		dlugosc = sizeof(klient_adres);

		if((sesja_gniazdo = accept(serwer_gniazdo, (struct sockaddr *) &klient_adres, &dlugosc )) == -1) {
			printf("blad accept()");
			return 1; 
		}
		
		odczyt = fdopen(sesja_gniazdo, "r");
		if(!odczyt) {
			fclose(odczyt);
			continue;
		}

		zapis = fdopen(dup(sesja_gniazdo), "w");
		if(!zapis) {
			fclose(zapis);
			continue;
		}

		setlinebuf(odczyt); setlinebuf(zapis);
			
		while (fgets(bufor, sizeof(bufor), odczyt)) {
			obsluz(zapis, bufor);
		}
	}

return 0;
}

KLIENT:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <signal.h>


int main(int argc, char * argv[]) {
	int z;
	int dlugosc;
	int gniazdo;
	unsigned int port;
	char bufor[128];	
	
	struct sockaddr_in adres;
	pid_t PID;
	

		if (argc >= 2) {
			port = atoi(argv[1]);
		}
		else {
			printf("Na jakim porcie nasluchuje serwer? ");
			scanf("%u", &port);
		}

		if ((gniazdo = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
			printf("blad socket()");
		return 1;
		}

		memset(&adres, 0, sizeof(adres));

	adres.sin_family = AF_INET;
	adres.sin_port = ntohs(port);
	adres.sin_addr.s_addr = inet_addr("127.0.0.1");

	dlugosc = sizeof(adres);

	if((connect(gniazdo, (struct sockaddr *) &adres, dlugosc)) == -1) {
		printf("blad connect()");
	return 1;
	}

	if ((PID = fork()) == -1) {
		printf("Blad fork()");
	return 1;
	}

////////////////////////////////////////////
///////////////////////////////////////////
//dotąd jest ok, tu trzeba cos poprawic
/////////////////////////////////////////
/////////////////////////////////////////
while(1) {

	if(PID == 0) {
		fgets(bufor, 128, stdin);
		send(gniazdo, bufor, strlen(bufor), 0);
		memset(bufor, 0, 128);
        }

	else {
		recv(gniazdo, bufor, 128, 0);
		printf("%s", bufor);
	}
}

close(gniazdo);

return 0;
}

Serwer otrzymuje żądanie, drukuje je u siebie (w celu potwierdzenia, że je odebrał) po czym wysyła odpowiedz "OK" której jednak klient nie wyświetla (nie dostaje).

Co tu zmienić?

0

..po co sie forkujesz w kliencie? dla jakiejs wyzszej idei czy teog wlasnie nie-do-pomyslales?

0

hmm... po prostu tak mi polecił starszy kolega-programista bardziej doświadczony niz ja... bez forka() w ogole aplikacja sie blokowała

0

ok.. masz racje fork() jest zupełnie nie potrzebny - teraz w sumie działa, jest jedno "ale" ale myśle, że zaraz sobie z tym poradzę :) pozdr!

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