Fallo al acceder servidor con sockets mediante http (C)
Tengo el siguiente codigo, que hace una petición httpa un servidor xitami. La respuesta del servidor es: HTTP/1.1 400 Bad request. Si accedo desde un navegador no tengo problema. Mi código es el siguiente:
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <windows.h>
/* try to tell linker where WinSock library is */
#if defined(_MSC_VER)
# pragma comment(lib,"wsock32.lib")
#elif defined(__BORLANDC__)
# pragma comment(lib,"mswsock.lib")
#endif
#define MAX_PAGE (1024*64)
/****************************************************************/
/******** PROGRAMA PRINCIPAL ********/
/***** Devuelve la página HTML con las variables de entorno *****/
/***** proprcionadas por el servidor y la entidad recibida *****/
/****************************************************************/
char PageBuffer[MAX_PAGE];
int GetAddr(const char* HostName, int Port, struct sockaddr* Result)
{
struct hostent* Host;
SOCKADDR_IN Address;
memset(Result, 0, sizeof(*Result));
memset(&Address, 0, sizeof(Address));
Host = gethostbyname(HostName);
if(Host != NULL)
{
Address.sin_family = AF_INET;
Address.sin_port = htons((short)Port);
memcpy(&Address.sin_addr, Host->h_addr_list[0], Host->h_length);
memcpy(Result, &Address, sizeof(Address));
}
return Host != NULL;
}
void ReadPage(const char* Host, const char* Page)
{
struct sockaddr SockAddr;
SOCKET Socket;
int Port = 80; /* HTTP */
if(GetAddr(Host, Port, &SockAddr))
{
int Status;
Socket = socket(AF_INET, SOCK_STREAM, 0);
Status = connect(Socket, &SockAddr, sizeof(SockAddr));
if(Status >= 0)
{
DWORD StartTime, EndTime;
char Request[512];
char Cadena[512];
char* Rover = PageBuffer;
int Read;
printf("pagina: %s n", Page);
sprintf(Request, "GET /%s HTTP/1.1nn", Page);
printf("comando: %s n", Request);
send(Socket, Request, strlen(Request), 0);
StartTime = GetTickCount();
for(Read=0;Read < MAX_PAGE;)
{
int ThisRead;
ThisRead = recv(Socket, Rover, MAX_PAGE-Read, 0);
if(ThisRead == SOCKET_ERROR || ThisRead == 0)
break;
else
{
Read += ThisRead;
printf("cadena: %s n", Rover);
Rover += ThisRead;
}
}
EndTime = GetTickCount();
printf("%d milliseconds to read %d-byte pagen",
EndTime-StartTime, Read);
closesocket(Socket);
memcpy(Cadena,"Escribete",10);
printf("cadena1: %s n cadena 2: %sn",Cadena,Rover);
}
else
fprintf(stderr, "connect failed (%d)n",
WSAGetLastError());
}
else
fprintf(stderr, "Can't map hostname '%s'n", Host);
}
int main()
{
WSADATA WsaData;
/* Right # of arguments? */
//assert(argc == 3);
WSAStartup(0x0001, &WsaData);
ReadPage("192.168.2.101","p1.html");
WSACleanup();
return 0;
}
Alguien sabe que está pasando?
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <windows.h>
/* try to tell linker where WinSock library is */
#if defined(_MSC_VER)
# pragma comment(lib,"wsock32.lib")
#elif defined(__BORLANDC__)
# pragma comment(lib,"mswsock.lib")
#endif
#define MAX_PAGE (1024*64)
/****************************************************************/
/******** PROGRAMA PRINCIPAL ********/
/***** Devuelve la página HTML con las variables de entorno *****/
/***** proprcionadas por el servidor y la entidad recibida *****/
/****************************************************************/
char PageBuffer[MAX_PAGE];
int GetAddr(const char* HostName, int Port, struct sockaddr* Result)
{
struct hostent* Host;
SOCKADDR_IN Address;
memset(Result, 0, sizeof(*Result));
memset(&Address, 0, sizeof(Address));
Host = gethostbyname(HostName);
if(Host != NULL)
{
Address.sin_family = AF_INET;
Address.sin_port = htons((short)Port);
memcpy(&Address.sin_addr, Host->h_addr_list[0], Host->h_length);
memcpy(Result, &Address, sizeof(Address));
}
return Host != NULL;
}
void ReadPage(const char* Host, const char* Page)
{
struct sockaddr SockAddr;
SOCKET Socket;
int Port = 80; /* HTTP */
if(GetAddr(Host, Port, &SockAddr))
{
int Status;
Socket = socket(AF_INET, SOCK_STREAM, 0);
Status = connect(Socket, &SockAddr, sizeof(SockAddr));
if(Status >= 0)
{
DWORD StartTime, EndTime;
char Request[512];
char Cadena[512];
char* Rover = PageBuffer;
int Read;
printf("pagina: %s n", Page);
sprintf(Request, "GET /%s HTTP/1.1nn", Page);
printf("comando: %s n", Request);
send(Socket, Request, strlen(Request), 0);
StartTime = GetTickCount();
for(Read=0;Read < MAX_PAGE;)
{
int ThisRead;
ThisRead = recv(Socket, Rover, MAX_PAGE-Read, 0);
if(ThisRead == SOCKET_ERROR || ThisRead == 0)
break;
else
{
Read += ThisRead;
printf("cadena: %s n", Rover);
Rover += ThisRead;
}
}
EndTime = GetTickCount();
printf("%d milliseconds to read %d-byte pagen",
EndTime-StartTime, Read);
closesocket(Socket);
memcpy(Cadena,"Escribete",10);
printf("cadena1: %s n cadena 2: %sn",Cadena,Rover);
}
else
fprintf(stderr, "connect failed (%d)n",
WSAGetLastError());
}
else
fprintf(stderr, "Can't map hostname '%s'n", Host);
}
int main()
{
WSADATA WsaData;
/* Right # of arguments? */
//assert(argc == 3);
WSAStartup(0x0001, &WsaData);
ReadPage("192.168.2.101","p1.html");
WSACleanup();
return 0;
}
Alguien sabe que está pasando?
Hola:
Ese error se debe a que el comando que le has mandado no le gusta o no lo entiende. El comando que mandas es un GET. Según veo, el comando GET tiene esta sintaxis
GET /index.html HTTP/1.0
From: [email protected]
User-Agent: HTTPTool/1.0
[Línea en blanco]
Tal cual lo tienes, te falta el From y el User-Agent, pero no la línea en blanco.
No tengo mucha idea del tema. La sintaxis esta la he visto en http://es.wikipedia.org/wiki/HTTP#Ejemplo_de_un_dialogo_HTTP y no sé si esos dos campos que te faltan son opcionales o no.
Se bueno.
Ese error se debe a que el comando que le has mandado no le gusta o no lo entiende. El comando que mandas es un GET. Según veo, el comando GET tiene esta sintaxis
GET /index.html HTTP/1.0
From: [email protected]
User-Agent: HTTPTool/1.0
[Línea en blanco]
Tal cual lo tienes, te falta el From y el User-Agent, pero no la línea en blanco.
No tengo mucha idea del tema. La sintaxis esta la he visto en http://es.wikipedia.org/wiki/HTTP#Ejemplo_de_un_dialogo_HTTP y no sé si esos dos campos que te faltan son opcionales o no.
Se bueno.