Mam napisać serwer który obsługuje 2 polecenia
quit - kończy połączenie
get - wysyła klientowi wynik wykonania programu /usr/bin/top
Wszystko działa dobrze tyle że polecenie get działa tylko raz, za każdym następnym razem program top się wykonuje prawidłowo ale dane nie są wysyłane do właściwego strumienia. Podejrzewam że coś pomieszałem z deskryptorami.
Proszę o pomoc :D
Oto kod funkcji obslugującej połączenie z klientem:
int ProcessConnection(int ChildSocket)
{
int CommandId; //Identyfikator komendy do wykonania
int TopPid; //Id procesu programu top
//Wiadomosci jakie moga byc wyslane do klienta
char *Prompt = "> ";
char *InvalidCommand = "> Invalid command, try again\n";
while (1)
{
//Wyslij znak zachety
if ((SendData(ChildSocket, Prompt)) < 0)
{
return -1;
}
//Odbirz id komendy podanej przez klienta
if ((CommandId = LoadCommand(ChildSocket)) < 0)
{
return -1;
}
//Obsluguj podana komende
switch (CommandId)
{
//Obsluga komendy quit
case 1 : return 0;
break;
//Obsluga komendy get
case 2 : if(pipe(Descriptors) < 0)
{
return -1;
}
//Tworzenie nowego procesu dla programu top
if ((TopPid = fork()) < 0)
{
close(Descriptors[0]);
close(Descriptors[1]);
return -1;
}
//Kod do wykonania w procesie potomnym
if (TopPid == 0)
{
const char *Path = "/usr/bin/top"; //Program do wykonania
char *const Arguments[] = //Argumenty wywolania programu
{
"/usr/bin/top",
"-b",
"-n",
"1",
NULL
};
//Zamknij deskryptor i podmien wyjscie
close(Descriptors[0]);
dup2(Descriptors[1], 1);
//Podmien kod procesu
if(execv(Path, Arguments) < 0)
{
close(Descriptors[1]);
exit(errno);
}
}
//Kod do wykonania w procesie macierzystym
else
{
int BuffLen = 100; //Dlugosc bufora odczytu
char Buff[BuffLen]; //Buforek
int BytesReceived; //Ilosc odebranych bajtow
close(Descriptors[1]);
while (BytesReceived != 0)
{
//Wyzeroj buforek
bzero(Buff,sizeof(Buff));
//Czytaj z lacza
if ((BytesReceived = read(Descriptors[0], Buff,BuffLen)) < 0)
{
wait(0);
close(Descriptors[0]);
return -1;
}
//Wyslij odczytane dane do klienta
if ((SendData(ChildSocket, Buff)) < 0)
{
wait(0);
close(Descriptors[0]);
return -1;
}
}
//Czekaj na zamkniecie procesu potomnego
wait(0);
close(Descriptors[0]);
}
break;
//Obsluga blenych komend
case 0 : if ((SendData(ChildSocket, InvalidCommand)) < 0)
{
return -1;
}
break;
}
}
return 0;
}