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ć?