Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. #include <errno.h>
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <sys/wait.h>
  12.  
  13. char * readFileContents(char * filename)
  14. {
  15. FILE *f = fopen(filename,"rb");
  16. if(f == NULL)
  17. {
  18. return "Nie znaleziono pliku html. \n";
  19. }
  20. fseek(f,0,SEEK_END);
  21. long fsize = ftell(f);
  22. fseek(f,0,SEEK_SET);
  23.  
  24. char * string = malloc(fsize+1);
  25. fread(string, 1, fsize, f);
  26. fclose(f);
  27. string[fsize] = 0;
  28.  
  29. return string;
  30. }
  31.  
  32. char * ShowTCPAdd( struct sockaddr_in * a )
  33. {
  34. static char tcpadd [ 16+6 ];
  35. sprintf( tcpadd, "%s:%d", inet_ntoa( a->sin_addr ), a->sin_port );
  36. return tcpadd;
  37. }
  38.  
  39. void processConnection( int sock, char * data )
  40. {
  41. //Funkcja do obslugi nawiazanego polaczenia. Tutaj ma mala funkcjonalnosc - tylko odbiera dane i wyswietla na ekranie. Mozna napisac czesc odpowiedzialna za odpowiadanie do klienta uzywajac funkcji write. Serwer moze np zamieniac duze znaki na male i tak poprawiony tekst odsylac do klienta.
  42.  
  43. char * header = "HTTP/1.0 200 OK\nContent-Type: text/html\n\n";
  44. write(sock,header,strlen(header));
  45. write(sock,data, strlen(data));
  46. }
  47.  
  48.  
  49. int main( int argc, char * argv [] )
  50. {
  51. int Sock;
  52.  
  53. //Domyslnie serwer slucha na porcie 13333 i kazdym interfejsie sieciowym
  54.  
  55. int Server_Port = 13333;
  56.  
  57. int koniec = 0;
  58. struct sockaddr_in srvadd;
  59. struct sockaddr_in kliadd;
  60.  
  61. printf("You can run this program as follows: %s [portnumber]\n", argv[0] );
  62.  
  63. //Utworzenie gniazda
  64.  
  65. if( ( Sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP) ) < 0 ) { // zamiast IPPROTO_TCP 0
  66. perror( "Can't create socket Sock" );
  67. return 1;
  68. }
  69. printf("Socket created, handle=%d\n", Sock );
  70.  
  71.  
  72. //Jesli podano port na ktorym ma nasluchiwac serwer to bedzie wczytany
  73.  
  74. if( argc > 1 ) Server_Port = atoi ( argv[ 1 ] );
  75.  
  76. //Przygotowanie struktury przechowujacej adres, na ktory bedzie dowiazany serwer (interfejs i port na ktorym nasluchuje)
  77.  
  78. memset(&srvadd, 0, sizeof(struct sockaddr_in) );
  79. srvadd.sin_family = AF_INET;
  80. srvadd.sin_addr.s_addr = htonl(INADDR_ANY);
  81. srvadd.sin_port = htons((u_short) Server_Port);
  82.  
  83. //Dowiazanie gniazda
  84.  
  85. if(bind(Sock, (struct sockaddr*) &srvadd, sizeof(srvadd) ) < 0) {
  86. perror("Error. Socket not bound.");
  87. close(Sock);
  88. return 1;
  89. }
  90. printf("Socket is bound.\n");
  91.  
  92.  
  93. //Przjescie w stan oczekiwania na zgloszenia
  94. char * dataToSend = readFileContents("site.html");
  95.  
  96. printf( "Listening ...\n" );
  97. listen( Sock, 2 );
  98.  
  99. while(! koniec) {
  100.  
  101. int childPid;
  102. int childSock;
  103. int kliaddlen;
  104.  
  105. kliaddlen = sizeof( kliadd );
  106.  
  107. //Wywolanie funkcji accept, w ktorej proces serwera "zawisa" az do momentu pojawienia sie zadania obslugi (polaczenia od klienta)
  108.  
  109. childSock = accept( Sock, (struct sockaddr *) &kliadd, &kliaddlen );
  110.  
  111. //Funkcja accept zwraca deskryptor nowego gniazda dedykowanego do obslugi polaczenia (zmienna childSock)
  112.  
  113. printf( "Server accepted connection from %s\n", ShowTCPAdd( &kliadd ) );
  114.  
  115. if( childSock < 0 ) {
  116. printf( "Server main: accept error\n" );
  117. koniec = 1;
  118. } else {
  119.  
  120. //Utworzenie procesu potomnego do obslugi polaczenia
  121.  
  122. childPid = fork();
  123. if( childPid < 0 ) {
  124. printf( "Server child: fork error\n" );
  125. close( childSock );
  126. koniec = 1;
  127. }
  128. if( childPid == 0 ) {
  129.  
  130. //Potomek. Zamyka gniazdo "glowne", na ktorym nasluchuje serwer. Bedzie uzywal gniazda dedykowanego.
  131.  
  132. close( Sock );
  133.  
  134. //Wejdz do funkcji obslugujacej polaczenie
  135.  
  136. processConnection( childSock,dataToSend );
  137. close( childSock );
  138. printf( "Server child closed connection, exiting\n" );
  139. exit( 0 );
  140. } else {
  141.  
  142. //Proces macierzysty. Zamyka gniazdo dedykowane do obslugi polaczenia, po czym wraca w petli do funkcji accept i czeka na kolejne zgloszenia
  143. close( childSock );
  144. }
  145. }
  146. }
  147. close( Sock );
  148. while(wait(0)!=-1){};
  149. return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement