1 #include <sys/types.h> 2 #include <sys/socket.h> 3 #include <netinet/in.h> 4 #include <netdb.h> 5 #include <stdio.h> 6 // printfy 7 #include <stdlib.h> 8 // exit() 9 #include <string.h> 10 //zawiera definicje memset() 11 12 #define SERVER_PORT 4095 13 #define BUF_SIZE 4096 14 #define QUEUE_SIZE 10 15 16 fatal(char *x) 17 { 18 printf("%s", x); 19 exit(1); 20 } 21 22 int main(int argc, char **argv) 23 { 24 char bufor[BUF_SIZE]; 25 int gniazdo, one = 1, i; 26 struct hostnet *ServerInfo; 27 struct sockaddr_in NrIP; 28 29 memset(&NrIP, 0, sizeof(NrIP)); // wypelniam zerami NrIP 30 NrIP.sin_family = AF_INET; // dziedzina adresów: IPv4 31 NrIP.sin_addr.s_addr = htonl(INADDR_ANY); 32 /* moze korzystac z kazdego numeru IP jaki znajdzie dla danego 33 komputera. W praktyce oznacza to, ze gdy sa dwa interfejsy 34 (np. siec lokalna z kabelka i wifi(internet) to obslugiwane 35 beda polaczenia od obu tych interfejsów */ 36 NrIP.sin_port = htons(SERVER_PORT); //nr portu 37 38 gniazdo = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 39 /* SOCK_STREAM - dane przesylane strumieniowo 40 IPPRO_TCP - z wykorzystaniem protokolu TCP */ 41 if (gniazdo < 0) 42 fatal("Blad utworzenia gniazda\n"); 43 44 setsockopt(gniazdo, SOL_SOCKET, SO_REUSEADDR, (char*) &one, sizeof(one)); 45 /*SOL_SOCKET - operacja ma byc wykonana na poziomie gniazda 46 (a nie na przez oprogramowanie IPv4 lub TCP) 47 SO_REUSEADDR - pozwalamy na wiele równoczesnych polaczen serwera. 48 Ustawiamy ta wartosc (one). Ostatni parametr mówi jak 49 duza jest zmienna one */ 50 51 //zmienna one nie jest juz dalej potrzebna. 52 one = bind(gniazdo, (struct sockaddr *) &NrIP, sizeof(NrIP)); 53 if (one < 0) 54 fatal("Blad przyporzadkowania adresu IP do gniazda\n"); 55 56 // maksymalna ilosc zadan polaczenia 57 one = listen(gniazdo, QUEUE_SIZE); 58 if (one < 0) 59 fatal("Error: listen()\n"); 60 61 //-------------------------------------------------------------- 62 // gniazdo gotowe do pracy 63 //-------------------------------------------------------------- 64 65 while (1) 66 { 67 one = accept(gniazdo, 0, 0); 68 /* argumenty 2 i 3 moga okreslac strukture sockaddr, która 69 zostalaby wypelniona danymi nt polacznia - niepotrzebne nam to. */ 70 if (one < 0) 71 fatal("Error: accept()\n"); 72 read(one, bufor, BUF_SIZE); // odczytanie nazwy przychodzacego pliku 73 i = -1; 74 if (bufor == "LIST") i = 0; 75 if (bufor == "GET") i = 1; 76 if (bufor == "CLOSE") i = 2; 77 78 switch (i) 79 { 80 case 0: 81 printf("Odebralem LIST\n"); 82 break; 83 case 1: 84 printf("Odebralem GET\n"); 85 break; 86 case 2: 87 printf("Odebralem CLOSE\n"); 88 break; 89 default: 90 printf("Zly format polecenia\n"); 91 break; 92 }; 93 close(one); // rozlaczenie 94 } 95 96 } 97