![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Como crear un servidor http de varios tiros ??
Buenas, soy nuevo en el foro.. pero es mas que seguro de que voy a seguir por aca..
Soy estudiante de un colegio industrial, y tengo como tarea, hacer un servidor http de varios tiros con delphi. La instruccion que me dan en el colegio es muy poca, y es mas, hay muchos profesores que no saben nada.. asique nose como hacerlo. Si alguno me puede dar una mano, seria espectacular : ) desde ya gracias. |
#2
|
||||
|
||||
Hola, bienvenido a clubdelphi, te aconsejo que leas nuestra guía de estilo para poder entendernos mejor.
En cuanto a tu problema, ¿en qué parte del proyecto necesitas ayuda?, ¿qué llevas hecho?, ¿qué problema exactamente tienes?. Por cierto, no entiendo tu expresión de hacer un servidor http "de varios tiros" ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
|||
|
|||
en todo ^^ .. lo unico que tenemos es un codigo en c (siendo que nunca vimos c) que es de un solo tiro ..
con varios tiros se refiere a que se puedan hacer varias peticiones y respuestas sin cerrar el servidor.. necesitaria saber que es lo que tiene que tener este proyecto.. como tendria que ser la estructura. |
#4
|
|||
|
|||
el codigo de c es el siguiente y es solo un ejemplo :
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <stdio.h> #include <windows.h> #include <winsock.h> //--------------------------------------------------------------------------- char SendBuff[2048],RecvBuff[2048]; #pragma argsused int main(int argc, char* argv[]) { WSADATA wsaData; SOCKET conn_socket,comm_socket; //SOCKET comunicacion; struct sockaddr_in server; struct sockaddr_in client; struct hostent *hp; int resp,stsize; //Inicializamos la DLL de sockets resp = ::WSAStartup(MAKEWORD(2,2),&wsaData); if( resp ) { printf("Error al inicializar socket\n"); getchar(); return resp; } //Obtenemos la IP que usará nuestro servidor... // en este caso localhost indica nuestra propia máquina... hp = (struct hostent *)::gethostbyname("localhost"); if (!hp ) { printf("No se ha encontrado servidor...\n"); getchar(); ::WSACleanup(); return ::WSAGetLastError(); } // Creamos el socket... conn_socket = ::socket(AF_INET,SOCK_STREAM, 0); if ( conn_socket==INVALID_SOCKET ) { printf("Error al crear socket\n"); getchar(); ::WSACleanup(); return ::WSAGetLastError(); } // Asociamos ip y puerto al socket memset(&server, 0, sizeof(server)) ; memcpy(&server.sin_addr, hp->h_addr, hp->h_length); server.sin_family = hp->h_addrtype; server.sin_port = htons(6000); resp = ::bind(conn_socket, (struct sockaddr *)&server, sizeof(server)); if ( resp == SOCKET_ERROR) { printf("Error al asociar puerto e ip al socket\n"); ::closesocket(conn_socket); ::WSACleanup(); getchar(); return ::WSAGetLastError(); } // Listen ... if ( ::listen(conn_socket, 1) == SOCKET_ERROR) { printf("Error al habilitar conexiones entrantes\n"); ::closesocket(conn_socket); ::WSACleanup(); getchar(); return ::WSAGetLastError(); } // Aceptamos conexiones entrantes printf("Lite HTTP Server v 0.01 , esperando conexiones entrantes... \n"); stsize = sizeof(struct sockaddr); comm_socket = ::accept(conn_socket,(struct sockaddr *)&client,&stsize); if ( comm_socket == INVALID_SOCKET) { printf("Error al aceptar conexión entrante\n"); ::closesocket(conn_socket); ::WSACleanup(); getchar(); return ::WSAGetLastError(); } // Identificamos al cliente ... printf("Conexión entrante desde: %s\n", inet_ntoa(client.sin_addr)); // Como no vamos a aceptar más conexiones cerramos el listen socket ... ::closesocket(conn_socket); // Recibimos la peticion HTTP ... // printf("HTTP Request... \n\n"); ::recv (comm_socket, RecvBuff, sizeof(RecvBuff), 0); printf("Datos recibidos:\n %s \n", RecvBuff); //Enviamos la respuesta HTTP... // char httpStartLine[] = "HTTP/1.1 200 OK\r\n" ; char httpHeaderDate[] = "Date: Vie, 17 Set 2010 13:05:59 GMT\r\n" ; char httpHeaderContentType[] = "Content-Type: text/html\r\n" ; char httpHeaderContentLength[] = "Content-Length: %d\r\n" ; char blankLine[] = "\r\n" ; char httpBody[] = "<html><body><h1>LiteHttp ( one shot http server )" " Welcome Page</h1></body></html>" ; char httpResponse[ 4096 ] = { "\0" } ; strcpy( httpResponse, httpStartLine ) ; strcat( httpResponse, httpHeaderDate ) ; strcat( httpResponse, httpHeaderContentType ) ; int contentLenght = strlen( httpBody ) ; sprintf( httpHeaderContentLength, "Content-Length: %d\r\n", contentLenght ) ; strcat( httpResponse, httpHeaderContentLength ) ; strcat( httpResponse, blankLine ) ; strcat( httpResponse, httpBody ) ; // Respuesta Enviada ... printf("Respuesta enviada ...\n\n" ); printf("%s\n\n", httpResponse ); printf("Enviando http response... \n\n"); ::send (comm_socket, httpResponse, sizeof(httpResponse), 0); getchar(); // Cerramos el socket de la comunicacion ::closesocket(comm_socket); // Cerramos liberia winsock ::WSACleanup(); return 0 ; } |
#5
|
||||
|
||||
Lo que tienes que hacer es primero que todo, entender el protocolo HTTP:
http://www.tutorialspoint.com/http/index.htm http://www.jmarshall.com/easy/http/ De forma simple, debes entender que HTTP es un protocolo de texto plano. Que se basa en urls y que posee varios verbos (VERBS) los cuales son: GET (leer) POST (postear: en términos reales, mezcla tanto crear, actualizar y borrar, pero debería ser solo actualizar) PUT (crear) DELETE (borrar) HEAD (solicitar encabezado) y otros menos usados. Implementar un servidor es en terminos generales, responder a solicitudes de GET, POST, etc y retornar ya sea archivos, datos, lo que sea, codificado en formatos de texto. Un ejemplo mas o menos completo: http://delphiallimite.blogspot.com/2...synapse-3.html
__________________
El malabarista. |
#6
|
||||
|
||||
Una puntualización: eso no es C, es C++. Es que no es lo mismo (por ejemplo, a mi me gusta bastante C pero aborrezco C++ con toda mi alma, al igual que varios colegas que conozco).
Por otro lado, procura utilizar las etiquetas [code]..[/code] cuando escribas código fuente, porque se ve más claro. También puedes utilizar los botones ![]() ![]() ![]() ![]() Finalmente, y ya haciendo referencia a tu pregunta, tienes varias formas de manejar esto. Sin haber pensado mucho se me ocurre que la más sencilla (que no simple) sería un bucle que va despachando las conexiones una a una, mientras que la más simple (que no sencilla) sería utilizando distintos hilos de ejecución, una por conexión. |
#7
|
||||
|
||||
Cita:
![]() Con los componentes indy creo recordar que viene un ejemplo de servidor http
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#8
|
|||
|
|||
no tengo muchos conocimientos sobre lenguajes de programacion ... se delphi pero hasta ahi nomas... lo que necesitaria es saber que cosas tiene que tener el soft.. los pasos de las cosas que tengo que hacer(no el codigo) el codigo me lo rebusco yo ... ( ya seria pedir el soft sino).
Una cosa que me dijo el profesor es que tiene que ser un "servidor http lite" que soporte Cgi e Isapi. |
#9
|
||||
|
||||
Eso lo haces con delphi facil.
Para entender el asunto, lee los enlaces que te pase. Mirando el codigo de ejemplo o mirando los ejemplos instalados en la carpeta de indy (que a proposito tiene un servidor web completo) deberia bastar. Lo mejor para estas cosas es arrancar. Empieza a hacer el proyecto y lo vas manejando de a pasos. Pon una lista de lo que necesitas hacer y apagate a ella.
__________________
El malabarista. |
#10
|
|||
|
|||
En el ejemplo que me pasaste del blogspot habla de una libreria synapse. Con que delphi viene esta libreria?
pd. Disculpen por mi ignorancia ^^, |
#11
|
||||
|
||||
Sólo has de poner "synapse" en google y darle al botón buscar
![]() Aquí tienes el enlace: http://www.ararat.cz/synapse/doku.php/download
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#12
|
|||
|
|||
como podria hacer los siguiente ??
*habilitar libreria socket; *crear socket; *bindearlo con datos de ip y port; *habilitarlo para escuchar peticiones entrantes; *Ponerlo a escuchar Des pues de todo eso cuando recibe la peticion entrante: *generar un socket con la entrada; *recibir la peticion; *obtener el metodo; *responder segun el metodo al cual pertenezca; *volver a ponerlo a la escucha el socket |
#13
|
||||
|
||||
Las preguntas una a una, y cada pregunta debe ir en un hilo/tema nuevo
Lee nuestra guía de estilo.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
servidor http (idhttp) con pascalscript (remobjects) | JXJ | Varios | 0 | 28-11-2009 18:33:38 |
Como crear varios panels | Lupita | Varios | 2 | 17-07-2008 09:27:02 |
¿Cómo crear una DLL con varios formularios? | Javi2 | Varios | 3 | 25-05-2006 10:35:06 |
Como crear un web hosting en mi servidor | dcmorell | Internet | 0 | 14-01-2006 21:46:00 |
MozPHP: PHP sin servidor HTTP ... | kinobi | PHP | 0 | 03-09-2003 11:19:52 |
![]() |
|