From 3010b45e05ced2c655e90d40d74e4e80865a0d07 Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 10 Nov 2019 19:20:56 +0100 Subject: [PATCH] =?UTF-8?q?Comit=20-=20Wiosenne=20porz=C4=85dki?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/server2.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 server/server2.c diff --git a/server/server2.c b/server/server2.c new file mode 100644 index 0000000..066693b --- /dev/null +++ b/server/server2.c @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct client_socket + { + int socket; + int socket2; + struct sockaddr_in accept_adr; + char message[1024] = "/EMPTY"; + //char name[20] = ""; + }; + +int main(void) { + //ZMIENNE + struct sockaddr_in bind_adr; + int socket_bind; + char msg[1024]; + struct client_socket client[7]; + fd_set Clients; + fd_set Socket; + socklen_t dl = sizeof(struct sockaddr_in); + int temp_accept; + int i; + int j; + char ff; + int max_fd; + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + + + //INICJALIZACJA: Tablica Klientów + for(i=0; i<=4; i++){ + client[i].socket = 0; + } + printf("INICJALIZACJA: Tablica Klientow\n"); + + + + //INICJALIZACJA: Socket + socket_bind = socket(AF_INET, SOCK_STREAM, 0); + if(socket_bind < 0) { + printf("Error: Socket\n"); + return 1; + } + printf("INICJALIZACJA: Socket\n"); + + + + //INICJALIZACJA: Adres + bind_adr.sin_family = AF_INET; + bind_adr.sin_port = htons(44444); + bind_adr.sin_addr.s_addr = INADDR_ANY; + + + + //INICJALIZACJA: Bind + if (bind(socket_bind, (struct sockaddr*) &bind_adr, sizeof(bind_adr)) < 0){ + printf("Error: Bind\n"); + return 1; + } + printf("INICJALIZACJA: Bind\n"); + + + + //INICJALIZACJA: Listen + if (listen(socket_bind, 10) < 0) { + printf("Error: Listen\n"); + return 1; + } + printf("INICJALIZACJA: Listen\n"); + + + + //NASŁUCHIWANIE KLIENTÓW + while (1) { + //INICJALIZACJA: Zbiór Deskryptorów + FD_ZERO(&Socket); + FD_SET(socket_bind, &Socket); + + + + //SELECT - Sprawdzanie nowych połączeń + //Select sprawdza czy można na socketcie wykonać jakiś accept - sprawdza czy ktoś się chce połączyć + if(select(socket_bind+1, &Socket, NULL, NULL, &timeout) > 0) { + if (FD_ISSET(socket_bind, &Socket)) { + temp_accept = accept(socket_bind, (struct sockaddr*) &client[i].accept_adr, &dl); + //Sprawdzenie na które miejsce w tablicy dopisać nowy gniazdo + for(i=0;i<=4;i++){ + if (client[i].socket == 0){ + client[i].socket = temp_accept; + break; + } else { + printf("Miejsce %i zajęte\n", i); + } + } + } + } + + + + //ZBIERANIE WIADOMOSCI + //Przejrzymy całą tablicę klientów i z tych połączonych zbierzemy ich wysłane wiadomosci + for(i=0;i<=4;i++) { + if(client[i].socket != 0) { + //Odbierz tylko kiedy coś przesłali + while(recv(client[i].socket, client[i].message, 1024, 0)>0) { + printf("Wiadomosc od %i: %s\n",i, client[i].message); + } + } + } + + //WYSYŁANIE WIADOMOSCI + //Znów przejrzymy całą tablicę klientów i jeżeli mają jakąś nową, nie pustą wiadomość - wyślij do wszystkich innych + for(i=0;i<=4;i++){ + if(client[i].socket != 0) { + for(j=0;j<=4;j++) { + if(client[j].socket!=0 && client[i].message != "/EMPTY" && j!=i) { + send(client[j].socket, msg, 1024, 0); + } + } + client[i].message = "/EMPTY"; + } + } + }//while +}//main