C/Visual C - Servidor web en C

 
Vista:
Imágen de perfil de Claudio

Servidor web en C

Publicado por Claudio (2 intervenciones) el 06/09/2016 13:00:56
Hola gente acá les dejo el código que hice hace algunos años de un servidor web escrito en C para compilarlo y ejecutarlo en sistema Linux. Lo había logrado hacer funcionar en una Mac y funcionaba bien. Podías ver hasta imágenes. El tema es que lo agarre de nuevo y lo compile y no me funciona como antes. La verdad no se que parte estará mal así que se los dejo para que lo investiguen. Ya les digo cuando lo hice funcionaba bien, es muy básico pero sirve para aprender. Lo pueden probar usando un navegador común poniendo "http://localhost/index.html:9999"
El puerto se puede cambiar desde el código.
Espero que les guste y me avisen siles funcionó.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//***********************************************************************************************************
//*********************************************** WARANI SERVER ver 0.01 ************************************
//*Este es el codigo de un servidor de paginas HTML basado en codigos de ejercicios de tranferencia de datos*
//*por TCP y otros que dan vueltad por la red. Como se daran cuenta es un servidor minimo pero efectivo el  *
//*cual responde bien a las peticiones de los navegadores mas usados lease : Zorro de fuego , Explorador y  *
//*el de la manzanita tambien.                                                                              *
//*De mas esta decir que el codigo esta liverado bajo la norma GPL V2 asi que pueden descargarlo, mejorarlo *
//*(eso es lo primero que deben hacer) y usarlo a gusto.                                                    *
//*Acepto sugerencias a este mail: warani_project@hotmail.com                                               *
//***********************************************************************************************************
 
#ifndef WIN32
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#else //---------------------- Aqui se incluyen los Headers para que funcione en Windwz------//
   #include <windows.h>
   #include <winsock.h>
#endif
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
int main()
{
  char* ver = "0.01";//------------Esta es la version//
  int mi_socket, nuevo, tam;
  FILE *archivo;//----------------Puntero de la funcion que abre el archivo//
  int  caracter;
  char* paginaerror = "<html><head><title>Error 404</title></head><body><p>No exixte esa pagina</p></body></html>";//-----Puntero del string error de pagina//
  int suma, len;
  int auxiliar;
  char bufrecv[1024];//----------Buffer para recepcion de datos del cliente//
  char bufenv[1024];//-----------Buffer para los datos que se enviaran//
  struct sockaddr_in mi_estructura;
  struct sockaddr_in dir_remota;
  char nombrepag[50];//----------Variable para el nombre de la pagina pedida//
  int cont = 0;
 
  printf("\n******************** WARANI SERVER Ver:%s ********************\n", ver);
//------------------------------Inicializa la estructura de conexión-------------------------------------//
  mi_estructura.sin_family = AF_INET;
  mi_estructura.sin_port =9999;//---------Aqui establecemos el puerto que va a escuchar(para html es el puerto 80//
  mi_estructura.sin_addr.s_addr = INADDR_ANY;//---La direccion ip del servidor en este caso localhost//
  memset( &(mi_estructura.sin_zero), '\0', 8 );
 
  mi_socket = socket( AF_INET, SOCK_STREAM, 0 );
  tam = sizeof( struct sockaddr );
 
  bind( mi_socket, (struct sockaddr *)&mi_estructura, tam );
  listen( mi_socket, 5 );//-Comienza la escucha del servidor, se establecen hasta 5 conexiones entrantes//
  printf("Escuchando...\n");
 
  while( 1 ) //-------------Bucle infinito para tratar conexiones//
  {
    nuevo = accept( mi_socket, (struct sockaddr *)&mi_estructura, &tam);//---Acepta conexión entrante//
 
    printf("%s Conectado\n", inet_ntoa(dir_remota.sin_addr)); //-------------Imprime la direccion IP del cliente//
 
    len = recv(nuevo, bufrecv, 1024, 0); //----------------------------------Recibe la peticion del cliente//
    bufrecv[len] = '\0';
    printf("%s\n", bufrecv);//---------Imprime la peticion del cliente//
    auxiliar=0;
    while (bufrecv[5+auxiliar] != ' ') //--Aqui se busca despues del GET la pagina pedida//
      {
        nombrepag[auxiliar] = bufrecv[5 + auxiliar];
        auxiliar++;
      }
 
     if(auxiliar < 1 ) //--Si la peticion es la pagina prinsipal osea '/' se enviara "index.html"//
      strcpy(nombrepag, "index.html");
     else
      nombrepag[auxiliar] = '\0';
      printf("%s\n", nombrepag);
 
 
//----------------------Aqui comiensa la sección de envio de datos------------------------//
    if( fork() == 0 )
    { // hijo
      close( mi_socket ); // El proceso hijo no lo necesita
 
   //-----------Abre el archivo de texto-----------//       
    if ((archivo = fopen ( nombrepag, "r")) != (FILE *)0)
    {
  cont = 0;
    while ((caracter = getc(archivo)) != EOF)//--Mientras no sea el final del archivo leera un caracter tras otro//
     {
       bufenv[cont++] = caracter ;
       if (cont >= 1024)
     {
       send (nuevo, bufenv, cont, 0);//---Envia datos al cliente si el Buffer de envio se ha llenado//
       cont = 0;
     }
     }
       send (nuevo, bufenv, cont, 0);//---Envia datos al cliente si se llego al final del archivo//
     }
      else
    {
      send (nuevo, paginaerror,strlen(paginaerror),0);//---Envia pagina de error 404//
      }
 
      fclose(archivo);
      close( nuevo );
      printf("%d Bytes enviados\n", suma);//----Imprime la cantidad de Bytes enviados//
 
      exit( 0 );
    } else { // padre
      close( nuevo );  // El proceso padre no lo necesita
 
  }
  }
 
  return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Superindio
Val: 47
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Servidor web en C

Publicado por Superindio (42 intervenciones) el 04/12/2018 23:10:08
Funciona che...
tuve que hacerle un pequeño cambio en la definicion de una variable, lo compile en unix y funciona
podriamos hacerlo multiproceso con Thread, en cuanto tenga tiempo lo modifico y me pongo en contacto con vos.
Saludos


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
******************** WARANI SERVER Ver:0.01 ********************
Escuchando...
0.0.0.0 Conectado
GET / HTTP/1.1
Host: ismacher.argenet.infra:1309
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-AR,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
 
 
index.html
0 Bytes enviados
0.0.0.0 Conectado
GET /favicon.ico HTTP/1.1
Host: ismacher.argenet.infra:1309
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: */*
Accept-Language: es-AR,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
 
 
favicon.ico
0 Bytes enviados
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar