diff --git a/server/server.c b/server/server.c index 07b44c1..56483c9 100644 --- a/server/server.c +++ b/server/server.c @@ -8,81 +8,28 @@ //Połączenia z wieloma klientami void ObsluzPolaczenie(int gn) { - char sciezka[512]; - long dl_pliku, wyslano, wyslano_razem, przeczytano; - struct stat fileinfo; - FILE* plik; - unsigned char bufor[1024]; - - memset(sciezka, 0, 512); - if (recv(gn, sciezka, 512, 0) <= 0) - { - printf("Potomny: blad przy odczycie sciezki\n"); - return; - } - - printf("Potomny: klient chce plik %s\n", sciezka); - - if (stat(sciezka, &fileinfo) < 0) - { - printf("Potomny: nie moge pobrac informacji o pliku\n"); - return; - } - - if (fileinfo.st_size == 0) - { - printf("Potomny: rozmiar pliku 0\n"); - return; - } - - printf("Potomny: dlugosc pliku: %d\n", fileinfo.st_size); - - dl_pliku = htonl((long) fileinfo.st_size); - - if (send(gn, &dl_pliku, sizeof(long), 0) != sizeof(long)) - { - printf("Potomny: blad przy wysylaniu wielkosci pliku\n"); - return; - } - - dl_pliku = fileinfo.st_size; - wyslano_razem = 0; - plik = fopen(sciezka, "rb"); - if (plik == NULL) - { - printf("Potomny: blad przy otwarciu pliku\n"); - return; - } - - while (wyslano_razem < dl_pliku) - { - przeczytano = fread(bufor, 1, 1024, plik); - wyslano = send(gn, bufor, przeczytano, 0); - if (przeczytano != wyslano) - break; - wyslano_razem += wyslano; - printf("Potomny: wyslano %d bajtow\n", wyslano_razem); - } - - if (wyslano_razem == dl_pliku) - printf("Potomny: plik wyslany poprawnie\n"); - else - printf("Potomny: blad przy wysylaniu pliku\n"); - fclose(plik); - return; - /* char Msg[1024]; char Sciezka[1024]; while (1) { //recv() <- czeka na wiadomość + FD_ZERO(&readfds); + FD_SET(gniazdoTCP, &readfds); + timeout.tv_sec = 1; + timeout.tv_usec = 0; + gniazdo_src = socket(); + int gniazdo_kli; + if (select(gniazdo+1, &readfds, NULL, NULL, &timeout) > 0) + { + gniazdo_kli = accept(gniazdo_src, (struct sockaddr*) adres, &dladr); + } memset(Msg, 0, 1024); recv(Gniazdo_Klient, Msg, 1024, 0); //Porównywanie wiadomości - If (Msg == "wyślij") { - + If (Msg == "wyślij") { + } else (Msg = "pobierz") { } else (Msg == "exit") { @@ -132,37 +79,75 @@ int main(void) { } //Połączenie z wieloma Klientami /* - while(1) - { - dladr = sizeof(struct sockaddr_in); - gn_klienta = accept(gn_nasluch, (struct sockaddr*) &adr, &dladr); - if (gn_klienta < 0) - { - printf("Glowny: accept zwrocil blad\n"); - continue; - } - printf("Glowny: polaczenie od %s:%u\n", - inet_ntoa(adr.sin_addr), - ntohs(adr.sin_port) - ); - printf("Glowny: tworze proces potomny\n"); - if (fork() == 0) - { - //proces potomny - printf("Potomny: zaczynam obsluge\n"); - ObsluzPolaczenie(gn_klienta); - printf("Potomny: zamykam gniazdo\n"); - close(gn_klienta); - printf("Potomny: koncze proces\n"); - exit(0); - } - else - { - // proces macierzysty - printf("Glowny: wracam do nasluchu\n"); - continue; - } - } + struct sockaddr_in adr_serv; + int gt, port; + + printf("Numer portu: "); + scanf("%d", &port); + + gt = socket(PF_INET, SOCK_STREAM, 0); + + adr_serv.sin_family = AF_INET; + adr_serv.sin_port = htons(port); + adr_serv.sin_addr.s_addr = INADDR_ANY; + + if (bind(gt,(struct sockaddr*) &adr_serv, + sizeof(struct sockaddr_in)) < 0) + { + printf("Bind nie powiodl sie.\n"); + return 1; + } + + + if (listen(gt, 10) < 0) + { + printf("Listen nie powiodl sie.\n"); + return 1; + } + + + ObsluzObaProtokoly(gt, &adr_serv); + fd_set readfds; + struct timeval timeout; + unsigned long proba; + proba = 0; + + while(1) + { + FD_ZERO(&readfds); + FD_SET(gniazdoTCP, &readfds); + timeout.tv_sec = 1; + timeout.tv_usec = 0; + if (select(gniazdoTCP+1, &readfds, NULL, NULL, &timeout) > 0) + { + proba = 0; + if (FD_ISSET(gniazdoTCP, &readfds)) + ObsluzTCP(gniazdoTCP, adres); + int nowe_gniazdo; + char bufor[1024]; + socklen_t dladr = sizeof(struct sockaddr_in); + nowe_gniazdo = + accept(gniazdo, (struct sockaddr*) adres, + &dladr); + if (nowe_gniazdo < 0) + { + printf("Bledne polaczenie (accept < 0)\n"); + return; + } + memset(bufor, 0, 1024); + while (recv(nowe_gniazdo, bufor, 1024, 0) <= 0); + DrukujNadawce(adres); + printf("[TCP]: %s\n", bufor); + close(nowe_gniazdo); + } + else + { + proba++; + printf("Czekam %lu sekund i nic ...\n", proba); + } + } + + return 0; */ //Polączenie z wieloma klientami