![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
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
|
||||
|
||||
|
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 , , y , dependiendo del lenguaje que utilices (el primero es genérico).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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment |
|
#6
|
||||
|
||||
|
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 |
|
#7
|
||||
|
||||
|
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. |
|
#8
|
|||
|
|||
|
En el ejemplo que me pasaste del blogspot habla de una libreria synapse. Con que delphi viene esta libreria?
pd. Disculpen por mi ignorancia ^^, |
|
#9
|
||||
|
||||
|
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 |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| 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 |
|