Fallo al acceder servidor con sockets mediante http (C)

lois
10 de Noviembre del 2005
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?

chuidiang
10 de Noviembre del 2005
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.