diff --git a/Server_v3.c b/Server_v3.c new file mode 100644 index 0000000..9d5eb65 --- /dev/null +++ b/Server_v3.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define Maks_liczba_klientow 5 + + +char *Klienci[Maks_liczba_klientow]; +int Gniazda[Maks_liczba_klientow] = {-1, -1, -1, -1, -1}; +pid_t Procesy[Maks_liczba_klientow]; + + +void Rozmawiaj(int Gniazdo_klienta, char *Adres_klienta) +{ + char Wiadomosc[2050]; + int i = 0; + + while (1) { + memset(Wiadomosc, 0, 2048); + + if (recv(Gniazdo_klienta, Wiadomosc, sizeof(Wiadomosc) - 2, 0) <= 0) + break; + + /* nie pokazuj entera tylko wypisz go jako '\n' */ + size_t len = strlen(Wiadomosc); + if (Wiadomosc[len - 1] == '\n') { + Wiadomosc[len - 1] = '\\'; + Wiadomosc[len + 0] = 'n'; + Wiadomosc[len + 1] = '\0'; + } + printf(" Odebrałem: '%s'\n", Wiadomosc); + if (Wiadomosc[len - 1] == '\\') { + Wiadomosc[len - 1] = '\n'; + Wiadomosc[len + 0] = '\0'; + } + + printf(" Rozsyłam wiadomość...\n"); + for (i = 0; i < Maks_liczba_klientow; i++) { + if (Gniazda[i] > 0) { + printf(" Wysyłam do klienta %s (Gniazdo: %d)\n", Klienci[i], Gniazda[i]); + send(Gniazda[i], Wiadomosc, strlen(Wiadomosc), 0); + } + } + } +} + + +int main(void) +{ + short Klient_istnieje = -1; + short Wolne_miejsce = Maks_liczba_klientow; + int i = 0; + int Port; + char Buffor[1024]; + int Gniazdo_serwera, Gniazdo_klienta; + + struct sockaddr_in Serwer, Klient; + + for (i = 0; i < Maks_liczba_klientow; i++) + { + Klienci[i] = malloc(64 * sizeof(char)); + } + + socklen_t Rozmiar_gniazda_serwera = sizeof(struct sockaddr_in); + + printf("Podaj port do nasluchiwania:"); + scanf("%u", &Port); + + Gniazdo_serwera = socket(PF_INET, SOCK_STREAM, 0); + + Serwer.sin_family = AF_INET; + Serwer.sin_port = htons(Port); + Serwer.sin_addr.s_addr = INADDR_ANY; + + memset(Serwer.sin_zero, 0, sizeof(Serwer.sin_zero)); + + if (bind(Gniazdo_serwera, (struct sockaddr*) &Serwer, Rozmiar_gniazda_serwera) < 0) + { + printf("Bind nie powiodl sie.\n"); + return 1; + } + + if (listen(Gniazdo_serwera, 10) < 0) + { + printf("Listen nie powiodl sie.\n"); + return 1; + } + + while (1) + { + if (Wolne_miejsce <= 0) + { + printf("Brak wolnych miejsc..."); + sleep(5); + } + + printf("Czekam na klienta...\n"); + Gniazdo_klienta = accept(Gniazdo_serwera, (struct sockaddr*) &Klient, &Rozmiar_gniazda_serwera); + + Wolne_miejsce --; + Gniazda[Wolne_miejsce] = Gniazdo_klienta; + strcpy(Klienci[Wolne_miejsce], inet_ntoa(Klient.sin_addr)); + Procesy[Wolne_miejsce] = fork(); + + if (Procesy[Wolne_miejsce] != 0) + { + close(Gniazdo_klienta); + } + else + { + printf(" Obsługuję klienta '%s'...\n", Klienci[Wolne_miejsce]); + + Rozmawiaj(Gniazdo_klienta, Klienci[Wolne_miejsce]); + + printf(" Skończyłem\n"); + + close(Gniazdo_klienta); + + exit(0); + } + } + + close(Gniazdo_serwera); + + return 0; +} \ No newline at end of file