Problemas al recibir respuesta web iniciando sesión cpp

Iniciado por Kaxperday, 25 Octubre 2014, 23:44 PM

0 Miembros y 1 Visitante están viendo este tema.

Kaxperday

Hola siento abrir otro tema, pero el anterior dejo de interesarme ahora tengo otro proyecto en mente, no se como va esto de las cookies. Haber quiero iniciar sesión en una página web con un programa en C/C++, ¿que debo hacer?

He probado a mandar esto:

Código (cpp) [Seleccionar]

int inicia_sesion(char* user, char *contraseña)
{
WSADATA wsa;
SOCKET sock;
unsigned short tamaño;
struct sockaddr_in directorio;
char datos[1500], variables[250];
char cookie[1000], auxiliar[50];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

strcpy_s(variables, "email=");
strcat_s(variables, user);
strcat_s(variables, "&password=");
strcat_s(variables, contraseña);
tamaño = strlen(variables);
_itoa_s(tamaño, auxiliar, 10);

strcpy_s(datos, "POST /login HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "Content-type: application/x-www-form-urlencoded\r\n");
strcat_s(datos, "Content-length: ");
strcat_s(datos, auxiliar);
strcat_s(datos, "\r\n\r\n");
strcat_s(datos, variables);

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
strcpy_s(datos, "");
recv(sock, datos, 1000, 0);
closesocket(sock);

ofstream cookies("cookies.txt");
int tam = strlen(datos), i, j;
char hookie[500];
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'c') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != ';')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
cookies << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
}
return 1;//para controlar errores si falla al iniciar sesion (sin hacer)
}



Al realizar esta función recibo lo siguiente:

HTTP/1.0 200 OK

Server: nginx

Date: Sat, 25 Oct 2014 21:19:24 GMT

Content-Type: text/html; charset=utf-8

Set-Cookie: dsi=20031e9671a05b580df037d3b1a3e849deb8853c%7EuOo6w03xntjgPZiaVDorb8aI6mv5Jz24lLGcoIUZvRP3EkFmprDY39ITuyVfaqyimvryApNqmfNAuVnYIjiQB%2FvFuh%2FfwOOW%2Btk%2BsU3KbiD4cQiRHPEYjCExkV2fuqIi0Sd4KuFqsrpPNf0%3D; expires=Sun, 26-Oct-2014 09:19:24 GMT; Max-Age=43200; path=/; domain=dominio.com

Set-Cookie: dsi=79e5a61e2302be64f79e118ed6e0faaa397758a1%7EL93SIQyyIU495qVRvBzSSvq%2BYynpPCUA%2F5ICO5rcOX4odLkpSkipzv1f2oCsWK16Xpvd6MKsyBRygveshy0oHIiy41Y7HEQFuLvA6LdpXNQ%2FZRMyuSdJdm1sFSZCeJoSdfnZilh5zKbyTEBqJzuJRYZb9v5MXgqkFgtaEmACPmzuAGw%3D; expires=Sun, 26-Oct-2014 09:19:24 GMT; Max-Age=43200; path=/; domain=dominio.com

Vary: Accept-Encoding

X-Cache: MISS from ubuntu

X-Cache-Lookup: MISS from ubuntu:3128

Via: 1.1 ubuntu:3128 (squid/2.7.STABLE9)

Connection: close



þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÌÌÌÌÌÌÌÌ


Bien se supone que con el código anterior debería de guardar las cookies es "dsi" en un archivo cookies.txt pues bien ese archivo está vacío. Vale ahora ya tengo las cookies suponiendo que eso hubiera funcionado, ¿ahora que debo hacer?, ¿cómo sé si he iniciado sesión o no?.

Ahora quiero meter un post a un directorio de la página para extraer datos de los subforos:

Código (cpp) [Seleccionar]
void descarga_foros_subforos()//Entra a foro y descarga foros, luego sus subforos.
{
WSADATA wsa;
SOCKET sock;
unsigned short tamaño;
struct sockaddr_in directorio;
char datos[20000], auxiliar[50];
char cookie[1000];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

ifstream cookies("cookies.txt");

strcpy_s(datos, "POST /foro HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla / 5.0 (Windows NT 6.2; WOW64) AppleWebKit"
"/ 537.36 (KHTML, like Gecko) Chrome / 38.0.2125.104 Safari / 537.36");
strcat_s(datos, "Content-type: application/x-www-form-urlencoded\r\n");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
strcat_s(datos, "\r\nSet-cookie: ");
strcat_s(datos, cookie);
}
strcat_s(datos, "\r\n\r\n");
cookies.close();

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
strcpy_s(datos, "");
recv(sock, datos, 20000, 0);
printf("Recibo: %s", datos); system("pause");
ofstream cookiez("cookies.txt",ios::ate);
int tam = strlen(datos), i, j;
char hookie[500];
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'c') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != ';')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
cookiez << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
cookiez.close();
for (i = 0; i < tam; i++)
               {
                       //aqui deberia hacer una busqueda de todos los divs
                       //que contengan x cadena para que me saque todos los temas
                       //que contengan esa cadena.
                }
}
}


Pero al ejecutar esto, ya vamos mal pues de lo anterior no conseguimos guardar las cookies pues fallo, y ahora lo recibido es:

HTTP/1.0 200 OK

Server: nginx

Date: Sat, 25 Oct 2014 21:42:13 GMT

Content-Type: text/html; charset=utf-8

Set-Cookie: dsi=2a6854eb4a0c7ab311cb3036afa75b515c2b1a21%7EVgq4JI%2B77r1QvKwCQl8HYd6r4%2BQq92HB9xVz0SFy5kKeKKWp9grCQsKChkSAsvWUub3v0M8TTkVXXQFze5VtbjHqRYJxBBT2%2FyaduSDYk0dYvCD%2FFeY9otr%2FmG2CfwMJsm0%2FPGRg6mWtxZ4%3D; expires=Sun, 26-Oct-2014 09:42:13 GMT; Max-Age=43200; path=/; domain=dominio.com

Set-Cookie: dsi=6cc09e824f232cb19286c1dd44263e086976997f%7EtQWb1SKlSJuGZoqVdPU%2FjX8YUqr4DTSIwKrAXE0WlWCde%2FiV4LwHjZZHcAjHAVxxOq8g%2Bbnyym1LihOnxn3l1ZvFLFiaIoRqVf5tMQCArvDkL8%2FE2JlmE0dEyIuqW8KHXUw%2B8SAu6mM1tq0%3D; expires=Sun, 26-Oct-2014 09:42:13 GMT; Max-Age=43200; path=/; domain=dominio.com

Vary: Accept-Encoding

X-Cache: MISS from ubuntu

X-Cache-Lookup: MISS from ubuntu:3128

Via: 1.1 ubuntu:3128 (squid/2.7.STABLE9)

Connection: close



þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ


El fichero de cookies sigue vacío, no tengo nada, ¿que ocurre? ¿alguien sabe que estoy haciendo mal? Y guiarme un poco con el procedimiento gracias.

Saludos.




Edito: En el anterior code no guardaba las cookies porque en el if puse "Set-cookie:" en vez de "Set-Cookie:" (solucionado ahora las cookies se guardan en el archivo).

Ayuda pls. He estado trabajando con el complemento firefox para cabeceras LIVE HTTP HEADERS, y bueno al intentar iniciar sesión obtuve esto:

POST /login HTTP/1.1
Host: dominio.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://dominio.com/login
Cookie: dsi=9888f8165173520951c8a290624375377019754c%7ExnMxIfJPCtfexiomYOApRUg5euo8voBRZGyPu76WNGsKvg%2Br216gsn9GD%2B%2BXoIBOaGsXTTAHafyzc%2Fcg4CzL1qIxmKH4EGcHdZCfgudd1LRRVR2GUIsripsJb0OMHSRB0PeC7NtV2s1D%2F0XqLiAeisQeSdn%2FEiXwrGpt%2FG2Tjbpwuj%2F%2BE4lf3%2FS1fKq8hjgTVRWG8M%2BGumOlp3c9BD%2B5XAxswAahq3DJKzXc5tolZ4FAn0gOiQCz%2B71TmTU%3D; _ga=GA1.3.243100690.1414398163; __insp_slim=1414398842749; __insp_nv=true; __insp_ref=d; __insp_norec_sess=true; __insp_wid=1437863939; _gat=1; _gat_newTracker=1
Connection: keep-alive
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 54
action=login&ref=&email=usuariooo&password=jhjhjh&cap=
HTTP/1.0 200 OK
Server: nginx
Date: Mon, 27 Oct 2014 08:36:18 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 6817
Set-Cookie: dsi=a0b3aecda88296af21c62c532c5b7c03d5f7c93b%7EU7%2Bubzy8doqEALJ7jARDFNGEBq0dkzo7Wl091fODByCwBML4wg7yHq4tlmZXwwor7FQsscwV3fbqwh2XDttQYQvBtfJSYJPM7SASc8NBcs2Tyg38nkVANIHEmQxaBlfe20QMB%2Bot0zHyelX3Qh%2BXREprwDuk73rdZX8KbrfeozDq8fRNhH8htoNCksatqok7GU%2BOYqiLROjkVJICyUvOLSMg0PcJQ40YIXm4a4wfQlzulpA%2FTAsMM8JP79l9Hw%3D%3D; expires=Mon, 27-Oct-2014 20:36:18 GMT; Max-Age=43200; path=/; domain=dominio.com
Vary: Accept-Encoding
Content-Encoding: gzip
X-Cache: MISS from ubuntu
X-Cache-Lookup: MISS from ubuntu:3128
Via: 1.1 ubuntu:3128 (squid/2.7.STABLE9)
Connection: keep-alive
----------------------------------------------------------
http://static.dominio.com/min/f=assets/css/style.css,assets/css/m.css,assets/css/i18n/es.css&v=1414059469,1414059469,1414059469&tt=.css


Haber esto es lo que manda firefox para una sesión errónea (mal introducido user y pass), el servidor lo recibe y ofrece un html de 6817 caracteres, y entonces firefox comienza a interactuar con el y a descargar dependencias para cargar el nuevo html y que pida de nuevo el usuario y contraseña.

Vaya yo no tuve la misma suerte, esto es lo que mando al servidor con mi programa sin previa conexión ojo, firefox quizás tuvo previa conexión por la cookie, pero no e de dónde la saca ni que son esos atributos que le pone en la cola.

Aún así me puse a copiarlo. En la primera interacción con el server mando lo mismo que firefox pero sin cookie y recibo una cadena de 62 caracteres que no veo sale basura, sale cortada la cadena al usar recv. De ahí saco las cookies del server las guardo en un archivo y hago un POST con ellas el mismo POST solo que con cookies y añadiendo la cola de las cookies de firefox.

haya va mi petición y su respuesta (primera interacción sin cookies del server aún):


POST /login HTTP/1.1
Host: dominio.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http ://dominio..com/login
Connection: keep-alive
Cache-Control: max-age=0
Content-type: application/x-www-form-urlencoded
Content-length: 74

action=login&ref=&email=usuariooo&password=jhjhjh&cap=



HTTP/1.0 302 Moved Temporarily
Server: nginx
Date: Mon, 27 Oct 2014 10:02:53 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 20
Set-Cookie: dsi=dbfb766863c26a84209efbcc8f7110e013504bf5%7ErN8ROCK%2B3Is1sShgBR7ZgDUnfp8tXsyWb1BDGTuqGVV5x7EVyiQeqC%2B0g5Y4kM5xmL547ur0MQRn6z6pPMuFIoGfJnMLGgX1cI4AT%2B47bHi4KeoMWVw3JMncuJXfZIiWoouTrDWCtGFCYw%3D%3D; expires=Mon, 27-Oct-2014 22:02:53 GMT; Max-Age=43200; path=/; domain=dominio.com

Location: http://dominio.com/

Set-Cookie: dsi=e276861b5ae8e19a3cbc0093c18763bf5eadcb95%7EeOgl6lcCqAMLk6czChQZip5pkuji%2FXHUNGo0MnvQVMUohPW45pGK7llGl8%2BO3CP9BwAmvlIgaAzyt9g0sAGh8JXsGIcvUWbJBEQKHB9Jg6qTmXGLi5QqO7CjhfJiEj2vbZl9uwVpuusocAeGFUA%2FYEmgWQH%2FEGic%2FSYBWNeUQHOi3xVk6RPT6EePeeKLCTqT4H%2BN3iQSCr%2FdDhNXiEls1DJAaDake4i00XcC%2Buo8Ow%3D%3D; expires=Mon, 27-Oct-2014 22:02:53 GMT; Max-Age=43200; path=/; domain=dominio.com
Vary: Accept-Encoding
Content-Encoding: gzip
X-Cache: MISS from ubuntu
X-Cache-Lookup: MISS from ubuntu:3128
Via: 1.1 ubunþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ


Esta es la segunda interacción con los cookies recibidos de la respuesta a la primera:


POST /login HTTP/1.1
Host: dominio.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http ://dominio.com/login
Cookie: dsi=dbfb766863c26a84209efbcc8f7110e013504bf5%7ErN8ROCK%2B3Is1sShgBR7ZgDUnfp8tXsyWb1BDGTuqGVV5x7EVyiQeqC%2B0g5Y4kM5xmL547ur0MQRn6z6pPMuFIoGfJnMLGgX1cI4AT%2B47bHi4KeoMWVw3JMncuJXfZIiWoouTrDWCtGFCYw%3D%3D;__insp_nv = true; __insp_ref = d; __insp_norec_sess = true; __insp_wid = 1437863939; _gat = 1; _gat_newTracker = 1; lfbs = f74842e072e54dff920fc7f53b775edf63a098e1%7E1
Cookie: dsi=e276861b5ae8e19a3cbc0093c18763bf5eadcb95%7EeOgl6lcCqAMLk6czChQZip5pkuji%2FXHUNGo0MnvQVMUohPW45pGK7llGl8%2BO3CP9BwAmvlIgaAzyt9g0sAGh8JXsGIcvUWbJBEQKHB9Jg6qTmXGLi5QqO7CjhfJiEj2vbZl9uwVpuusocAeGFUA%2FYEmgWQH%2FEGic%2FSYBWNeUQHOi3xVk6RPT6EePeeKLCTqT4H%2BN3iQSCr%2FdDhNXiEls1DJAaDake4i00XcC%2Buo8Ow%3D%3D;__insp_nv = true; __insp_ref = d; __insp_norec_sess = true; __insp_wid = 1437863939; _gat = 1; _gat_newTracker = 1; lfbs = f74842e072e54dff920fc7f53b775edf63a098e1%7E1Connection: keep - alive
Cache-Control: max-age=0
Content-type: application/x-www-form-urlencoded
Content-length: 74

action=login&ref=&email=usuariooo&password=jhjhjh&cap=


HTTP/1.0 302 Moved Temporarily
Server: nginx
Date: Mon, 27 Oct 2014 10:04:38 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 20
Location: http://dominio.com/
Set-Cookie: dsi=d49bf690a0b0c6c178353d7e8ecca1a2a3b1c354%7E%2FkSCggzmo5e0ABgqVr1RI4Ke%2FHT8IY1ScWZjvrmkE%2BoFAo7Y02%2BEYqYmGgutz0ZzYwBpJCRpdHLYYT8gZ%2BhQ07MjAnO%2BIlOSsAea8Frex4C2M8I4Pjf90u%2BNaNPMSe%2BhYFUMP2ORAMh2WfZv0kaD2f0ZwUovmlM%2FLvxck5eumaM8M8Vz8oW1tiIxzDf%2BNHtr4waooak7%2F8EMtwd9OSl2kRVEj1fglYP3CQ84UVkLrA%3D%3D; expires=Mon, 27-Oct-2014 22:04:38 GMT; Max-Age=43200; path=/; domain=dominio.com
Vary: Accept-Encoding
Content-Encoding: gzip
X-Cache: MISS from ubuntu
X-Cache-Lookup: MISS from ubuntu:3128
Via: 1.1 ubuntu:3128 (squid/2.7.STABLE9)
Connection: close

þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ


En resumen no obtengo la misma cadena de datos al hacer parecida petición al servidor desde firefoz que desde mi programa, solo cambió la cookie, ¿que puede fallar?.

:laugh: :laugh: :laugh: :laugh: :D :D
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

ivancea96

Te diría que hagas clases y funciones para hacer las conexiones al cliente, para así limpiar el código.
Por no decir, que deberías usar strcmp y strcpy (u otras fubciones similares), más que nada porque lo de "if(a=='x' && a[i+1]=='y' && ...)" es bastante innecesario.

eferion

#2
Deberías plantearte dejar de imitar a firefox y leerte la especificación http... ya que es ahí donde vas a ver para qué sirve cada uno de los elementos que componen una cabecera http, cómo se usan, cuándo hay que usarlos y cuáles son obligatorios y por qué.

Además, como te han recomendado, una de tus prioridades debería ser simplificar el código y crear un control de flujo limpio, ordenado y fácil de mantener.

Y, por cierto, ¿qué es toda esa basura que sale en tu respuesta al final de cada petición?

Kaxperday

#3
Soy un novato con esto (de todas formas por supuesto quiero aprender si queréis compartir conmigo apuntes de HTTP sobre esto será un placer estudiarlos xD), haber os paso mis objetivos antes que nada, quiero hacer un bot que inicie sesión en una web pasandole user y pass por teclado y comience a postear en temas automáticamente para obtener beneficios xD, soy casi nuevo en esto pero ganas no me faltan.

El código actual que uso para iniciar sesión es el siguiente:

Código (cpp) [Seleccionar]

int inicia_sesion(char* user, char *contraseña)
{
WSADATA wsa;
SOCKET sock;
unsigned short tamaño;
struct sockaddr_in directorio;
char datos[20000], variables[500];
char cookie[1000], auxiliar[50];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

//action = login&ref = &email = usuariooo&password = jhjhjh&cap =
strcpy_s(variables, "action=");
strcat_s(variables, "login");
strcat_s(variables, "&ref=");
strcat_s(variables, "");
strcat_s(variables, "&email=");
strcat_s(variables, user);
strcat_s(variables, "&password=");
strcat_s(variables, contraseña);
strcat_s(variables, "&cap=");
strcat_s(variables, "");

tamaño = strlen(variables);
_itoa_s(tamaño, auxiliar, 10);

ifstream cookies("cookies.txt");
bool var = false;

strcpy_s(datos, "POST /login HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Accept-Encoding: gzip, deflate\r\n");
strcat_s(datos, "Referer: http ://dominio.com/login");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
var = true;
strcat_s(datos, "\r\nCookie: ");
strcat_s(datos, cookie);
strcat_s(datos, ";__insp_nv = true; __insp_ref = d; __insp_norec_sess = true; __insp_wid = 1437863939; _gat = 1; _gat_newTracker = 1; lfbs = f74842e072e54dff920fc7f53b775edf63a098e1%7E1");
}
if (var == false)
{
strcat_s(datos, "\r\n");
}
strcat_s(datos, "Connection: keep - alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "Content-type: application/x-www-form-urlencoded\r\n");
strcat_s(datos, "Content-length: ");
strcat_s(datos, auxiliar);

strcat_s(datos, "\r\n\r\n");
strcat_s(datos, variables);

cookies.close();
connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
printf("mando: %s", datos); system("pause");
strcpy_s(datos, "");
recv(sock, datos, 10000, 0);
printf("recibo: %s", datos); system("pause");
closesocket(sock);

ofstream hookies("cookies.txt");
int tam = strlen(datos), i, j;
char hookie[500];
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'C') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != ';')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
hookies << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
hookies.close();
}
return 1;//habría que comprobar si se inicio bien sino distinto de 1.
}


La basura me salen tantos caracteres como los que sobran al definir datos[20000], que es la variable que envía la petición y que recibe la respuesta. A veces se sobrescribe parte de la respuesta, no se porqué.

El código admito puede ser engorroso pero al menos quiero ver si funciona en modo prueba, y luego ya lo perfeccionaría del todo. De todas formas eso de strcmp() no sé como sería, de todas formas si así distingue bien las cookies no se para que darle más vueltas xP.

También me llama la atención que en una web que tengo un simple POST me carga en la variable todo el código html con la cabecera de respuesta, en cambio aquí quiero descargar el html y no me sale nada, es un html público que no requiere iniciar sesión y pueden ver todos, lo necesito descargar para extrar de el los foros y subforos que tiene la web y desde ahí poder postear para cada uno de ellos.

Este es el código utilizado para "intentar" descargar el html desde donde extraería foros y subforos:

Código (cpp) [Seleccionar]

void descarga_foros()
{
WSADATA wsa;
SOCKET sock;
unsigned short tamaño;
struct sockaddr_in directorio;
char datos[20000], auxiliar[50];
char cookie[1000];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

ifstream cookies("cookies.txt");

strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "Content-type: application/x-www-form-urlencoded");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
strcat_s(datos, "\r\nCookie: ");
strcat_s(datos, cookie);
}
strcat_s(datos, "\r\n\r\n");
cookies.close();

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
printf("%s", datos);
strcpy_s(datos, "");
recv(sock, datos, 10000, 0);
closesocket(sock);
printf("Recibo: %s", datos); system("pause");
ofstream cookiez("cookies.txt",ios::ate);
int tam = strlen(datos), i, j;
char hookie[500];
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'C') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != ';')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
cookiez << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
cookiez.close();
for (i = 0; i < tam; i++)//algoritmo para sacar, va a div class="col"> donde se encuentran los temas del foro principal, luego en otra funcion hago lo mismo para subforos y en otra para los temas de los subforos. <div class = "col"> Está sin hacer porque no consigo bajar el html, público quizás detecte que es un bot e impida su descarga tendremos que evitarlo pues.

}
}


Bueno quizás eso de la basura sea clave porque quizás la basura nos cubra un link importante como el link del favicon desde el cual descargar todo lo demás no sé.

Pero aún así interesa el html del forum (foro publico y principal) allí buscaría los div con cierto identificador para aislar cada tema de foro y subforos...

Al ejecutar el descargador_foros() sin nada previo (sin cookies obtengo):

(Acabo de probarlo de nuevo, y oh lala me debe de enviar 23000 caracteres de respuesta es decir el html, pero no veo nada solo basura..)

POST /forum HTTP/1.1
Host: dominio.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://dominio.com/forum
Connection: keep-alive
Cache-Control: max-age=0




HTTP/1.0 200 OK
Server: nginx
Date: Mon, 27 Oct 2014 11:49:13 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 23068
Set-Cookie: dsi=0372200903e819a94eb7f81de8a194f34f9595e8%7ENA44FozKp0xVoOmhAupn2ZeFIqOoYQmrakZ%2FMcLMdaDeHvXFkgql9Kn%2BkhOgYFAkU5WeJTfVgy96Qfv7PkhuCCxV6eZ3kJyiNJT3DyRMYBMC7FvbrM%2B%2Fj54Eb4SnCBIHYLRCfQAlirlyHw%3D%3D; expires=Mon, 27-Oct-2014 23:49:13 GMT; Max-Age=43200; path=/; domain=dominio.com
Set-Cookie: dsi=aa77274477c182b15b8cf3ebf5954b33144cd0d4%7EWh2CtRrkLJfyjN7Rrm1WjXbM%2FVepKDzocfoU9kW8v8EAnzIeJxhlQuAStSAlQxTnT53oQNPnMRtVpUNxE%2BCufGHPNVTiGdWv2e1545JGOLCoE2WIX%2BcJV1jwMkgO6TWhEwdC3PE9Sug12Q%3D%3D; expires=Mon, 27-Oct-2014 23:49:13 GMT; Max-Age=43200; path=/; domain=dominio.com
Vary: Accept-Encoding
Content-Encoding: gzip
X-Cache: MISS from ubuntu
X-Cache-Lookup: MISS from ubuntu:3128
Via: 1.1 ubuntu:3128 (squid/2.7.STABLE9)
Connection: keep-alive


þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ(de esto 23000 cacas iguales xD)þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ


Pero me sale basura nada de code aunque segun pone el content-length es de 23000.
He probado a reenviar la misma funcion una vez realizada la primera con las cookies de la primera que nos dió el server y el server nos envía la misma cadena con la distinción de que tenía 2 caracteres más el content-length, prueba de que es el html dinámico que buscamos. Pero sale basura.

Eso creo que es todo hasta ahora, un inicio de sesión fallido o no (pues lo desconozco xd, supongo que si porque no me da cookies que no sean las de nombre dsi), y un intento de descarga de un html generado en dominio.com/forum que me sale basura en su lugar.

Edito: He puesto 30000 de tamaño a datos y se me sobreescribe de basura ahora la cmd jajaja xD, y si solo de basura, antes tenia 20000 y no tenia espacio para recibir todo, ahora debería tener pero sale basura, puede ser o que algo tenga o haga mal, o que la web envíe un fake de basura aposta.

Si alguien quiere probar el código y se implica un poco más que me mande un privado que le mando mi proyecto en visual studio 13 haber que tal le va.

Si os habéis leido esto que lo dudo SOY FELIZ  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:
Gracias por las respuestas sigo con ello, Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

eferion

Cita de: Kaxperday en 27 Octubre 2014, 13:06 PM
De todas formas eso de strcmp() no sé como sería

Si lo piensas, no es escusa. No vas a conseguir hacer nada por tu cuenta si no eres capaz de leer y entender la documentación de una API.

¿Que cuesta? sí, pero es un paso necesario y después verás que no es para tanto. Lo que está claro es que si sigues vendiendo que eres novato para justificar el echo de no perder ni 2 minutos en leer la documentación de una función... de la librería estándar... te vas a acabar estrellando contra un muro. Yo únicamente te aviso.

Cita de: Kaxperday en 27 Octubre 2014, 13:06 PM
de todas formas si así distingue bien las cookies no se para que darle más vueltas xP.

A diferencia de algo tangible y material, el código es algo virtual que no tiene forma, el código crea un universo propio en el que todo está conectado con todo y en el que se exige una armonía casi total entre los diferentes elementos del programa para que éste no de problemas... las chapuzas en programación no solo pueden dar resultados inesperados en cualquier momento... su corrección a posteriori puede resultar traumática porque sus efectos se pueden propagar de forma similar a como lo puede hacer un cáncer.

Por este motivo te digo que no, no es lo mismo hacer algo bien a hacer una chapuza y dejarlo así simplemente porque funciona. Obviamente tú, en calidad de autor de la aplicación, puedes hacer y dejar todas las chapuzas que quieras en tu código, pero luego cuando tengas que lidiar con fallos anclados en estas chapuzas recuerda lo que te estoy diciendo.

Cita de: Kaxperday en 27 Octubre 2014, 13:06 PM
Soy un novato con esto (de todas formas por supuesto quiero aprender si queréis compartir conmigo apuntes de HTTP sobre esto será un placer estudiarlos xD)

Especificación http ver 1.1

Si vas a trabajar con el protocolo http, la especificación de dicho protocolo debe ser la base de tu documentación. Después seguramente necesites material adicional, como ejemplos o comentarios de gente que ya se haya pegado con eso... pero la base es fundamental para entender lo que estás haciendo... si no es intentar entender un libro de astronomía sin tener ni idea de matemáticas, física, geometría, ...

Cita de: Kaxperday en 27 Octubre 2014, 13:06 PM
... y comience a postear en temas automáticamente para obtener beneficios

Intentas ir demasiado rápido, y no lo digo por este tema en concreto sino por todos los que has creado en este foro. Aprende primero la base con ejemplos más sencillos y con más tranquilidad podrás lanzarte a la aventura.

Da la sensación de que tus únicos objetivos en este foro pasan por sacar partido sin aportar absolutamente nada ( es decir, te sacamos las castañas del fuego, tus programas funcionan y después, si te he visto no me acuerdo ). Y si no no hay más que ver otros hilos, en lo que lo único que te preocupaba era que alguien te diese la respuesta concreta y exacta a tu pregunta... nada de darte ideas sobre cómo resolverlo...

Cita de: Kaxperday en 27 Octubre 2014, 13:06 PM
A veces se sobrescribe parte de la respuesta, no se porqué.

Nuevamente te falta leer la documentación. En este caso referente a sockets: documentación recv

Tu estás partiendo de la base de que el contenido recibido por un socket nunca va a ser binario... y eso es un error. Por un socket puedes enviar contenido binario sin ningún problema. Ello implica que los sockets no tienen por qué terminar las cadenas de envío/recepción con un '\0'. Es por eso que recv te retorna la longitud exacta de lo que almacena en el buffer.

Cita de: Kaxperday en 27 Octubre 2014, 13:06 PM
(Acabo de probarlo de nuevo, y oh lala me debe de enviar 23000 caracteres de respuesta es decir el html, pero no veo nada solo basura..)

Si tu buffer es de 20000, por muy bien que quieras hacer el resto ya tienes un problema.

Además, si te fijas, verás que su respuesta está comprimida con gzip... ¿ves como es importante conocer la especificación?

Y para terminar, por si acaso matizo: No intento ser borde, los foros son fríos porque no transmiten ni emociones ni lenguaje no verbal.

Y sí, me he leído tu mensaje hasta el final :)

Un saludo.

Kaxperday

#5
Bueno eferion gracias por la respuesta, la verdad tienes algo de razón en lo del foro que me paso a preguntar dudas concretas pero tampoco es eso, siempre he estado y estoy dispuesto a ayudar en algo a los que me ayuden en base a mis conocimientos. Y de vez en cuando trato de aportar, pero si vine fue más por aprender que otra cosa y os lo agradezco.

La verdad me surgen varios proyectos, trato de afrontarlos y me surgen dudas que posteo y busco como solucionar por google, si me conocía la función strcmp() xD, y busque antes de leer tu respuesta homólogos a la función recv() pues pensé que podía ser parte del problema.

Si me leo las funciones de mí código lo único que puedo desconocer (o debería) es la cabecera HTTP en lo que soy "nuevo", he visto tu link y era justo lo que necesitaba gracias, de todas formas intentaré dejar de preguntar de forma tan directa las dudas sin ir antes a sus alrededores.

Te agradezco la respuesta, cuando tenga tiempo trataré de arreglar lo de gzip y volveré con el code funcionando xD, o eso espero jaja espero no se haga tarde.

Saludos.




Bueno, el documento me ha venido bastante bien había muchas cosas que devolvía el server y ahora veo que todas tienen respuesta en el documento. La verdad queda buen libro por leer poco a poco.

Me he dado cuenta de que recv() recoge 1010 bytes (lo obtenido al recoger el valor devuelto por la función) pero sin embargo el content-length es de 23000 aprox), a parte de eso he probado a separar la parte de cabecera del body (lo binario si no me equivoco) traté de usar fwrite dentro de un for pero desconozco el tamaño del body pues si recojo 1010 bytes incluido los de cabecera, no puedo hacer un bucle de for sin conocer los limites segun el condent-length hasta 23000, aun asi es muy raro porque es una mezcla de caracteres y bytes lo que manda, la cabecera caracteres, el body bits supongo, mi idea era guardar los datos binarios en un archivo y guardarlo como .gzip, y tratar de abrirlo con winrar o algo así no he encontrado documentación de como descomprimirlo ni como extraer la parte binaria. Y el winrar falló en un par de intentos mal hechos reconozco.

Pero la idea sería desencriptarlo en el programa mismo en ejecución (será mejor no? xd), de todas formas algo falla porque en mi post mando accept-encoding se supone que el habrá mandado previamente content-encoding: gzip, y yo luego lo acepto pero no soy yo el primero que envía me gustaría evitar todos estos líos y hacer que me mande el html sin cifrar en texto plano, quizás sea posible o quizás el server no tenga la opción.

He probado a no poner el accept-encoding y me dice haber recibido el recv 865 y al mostrarlo no sale nada hay un vacío. No sé es un poco lioso, cuando tenga tiempo le doy otro repaso, pero faltan cosas xd, no puede ser que diga que manda 23000 y que reciba yo 1010, no sé de donde me complico tanto para descaragr un html de una web que es publico xD pensaba que era más fácil o me complico yo o la web es especial.

Pues nada parece que el server esta empeñado en comprimirlo en gzip para mi desgracia, con el campo o sin el, el server lo devuelve cifrado si queréis hacer la prueba os invito a un privado  ::) ::)

el código que uso actualmente con la ilusión de obtener en una variable un html es:

Código (cpp) [Seleccionar]

void descarga_foros()
{
WSADATA wsa;
SOCKET sock;
unsigned short tamaño;
struct sockaddr_in directorio;
char datos[30000], auxiliar[50];
char cookie[1000];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Accept-Encoding: gzip, deflate\r\n");
strcat_s(datos, "Referer: http://dominio.com/forum\r\n");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
strcat_s(datos, "Cookie: ");
strcat_s(datos, cookie);
strcat_s(datos, "\r\n");
}
strcat_s(datos, "Connection: keep-alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "\r\n\r\n");
cookies.close();

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
printf("%s", datos);
strcpy_s(datos, "");
printf("Recibo: %d bytes",recv(sock, datos, 27500, 0));
closesocket(sock);
printf("%s", datos);


He quitado lo de cookies porque no vale para nada en esta funcion la verdad, solo he dejado la parte que las guarda las que devuelve el server para continuar con las peticiones.

Procederéa programar con el fwrite() cuando conozca porque recv recibe 1010 bytes y el lenght del server pone 23000, luego supongo que tendré que crear un fichero binario, mover el puntero en la cadena recibida (que ahora es mixta de caracteres y bytes) y no se muy bien como haré eso pero luego haría bucle for hasta el final para ir escribiendo byte a byte en el archivo .gz o .gzip.

Código (cpp) [Seleccionar]

for(i=(posicion donde empieza lo binario); i<strlen(datos); i++)
{
fwrite(datos,sizeof(byte),sizeof(byte),archivo);
}


Código (cpp) [Seleccionar]

fwrite(datos,sizeof(byte),tamaño_body_en_bytes(content-length),archivo);


Nunca he trabajado con una cadena con datos de caracteres y otro binarios si podéis echarme un cable se agradece xd. Me fío mas de la ultima, segun esto, el content-length devuelve los bytes del body, entonces la pregunta sería como mover el puntero, los caracteres en binario con caracteres, la idea sería mover el puntero al inicio del body y alli meter el fwrite, pero como es eso posible? estoy pensando en ello. Gracias de nuevo.

También esta la dificultad de que recv() devuelve 1010 bytes mientras que el server dice mandar 23000 eso tambien me pregunto porque será, seguro vosotros sabéis mucho más de esto y quizás no os importe echarme una mano, ya sabéis que soy persistente xD me enfoco en algo y no puedo parar.

Y luego me mirare esto con detalle

Saludos.




Vaya he estado buscando como descomprimir archivos.gz (gzip), parecía bastante más sencillo, he encontrado 2 páginas:

http://www.boost.org/doc/libs/1_36_0/libs/iostreams/doc/classes/gzip.htmlhttp://www.zlib.net/

He probado con un ejemplo:

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>

int main()
{
   using namespace std;

   ifstream file("hello.gz", ios_base::in | ios_base::binary);
   filtering_streambuf<input> in;
   in.push(gzip_decompressor());
   in.push(file);
   boost::iostreams::copy(in, cout);
}


Pero a pesar de que aquí te deja seleccionar las librerías y sus derivados, SOLO quería preguntar si funcionaría añadir ese código, os cuento en archivos de cabecera del proyecto añadí esos 3 encabezados metiendolos dentro de los directorios (que no se si sería necesario lo dudo pero da igual), y cada uno de ellos tiene otras 10 dependencias más y esas otras 10 y blablabla, entonces como que ese no es el camino.

¿Alguien sabe como poder utilizar esas herramientas en el proyecto? También me descarge Zlib-1.2.8 pero no se como añadirlo/incluirlo al proyecto, pero de lo único que hay ejemplos es de la anterior, me pregunto como se podrá añadir, sino solo se me ocurre usar 7-zip pues ya llevo mucho tiempo buscando como poder hacerlo y nada, ademas aún no he conseguido aislar el body que devuelve el server.
Tampoco tenía sentido porque recibía 1010 y el body decía ser de 23000 ¿que es eso?

No tiene sentido, he trabajado con archivos binarios antes y al simple hecho de abrirlos con el bloc de notas podias observar que los caracteres se mantenian vale, pero el código binario (el cifrado tbn) salia de esta forma (/"%$("&/$))("Y (N() por ejemplo no þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ esto sale porque todos los bytes representan lo mismo el que no se? recv recibe una cadena, he probado a escribirla en un archivo inutilmente.


printf("Recibo: %d bytes",recv(sock, datos, 27500, 0));

FILE *fp;
fp = fopen("bin.gz", "wb");
fwrite(datos, sizeof(byte), sizeof(datos), fp);
fclose(fp);


¿Alguien sabe algun algoritmo para aislar el body (que esta comprimido en binario) de lo demás?
Es que es imposible el content-length no encaja con lo que recoje recv y recv lo recoge en una variable suficientemente grande, de tipo char * como indica la funcion, ahora me dicen que esa funcion recoge datos binarios comprimidos?.
PFF




Bueno aquí estoy de nuevo, miren mi nuevo código para descargar el html de la web:


void descarga_foros()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in directorio;
char datos[30000], cookie[1000];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

ifstream cookies("cookies.txt");

strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Accept-Encoding: gzip, deflate\r\n");
strcat_s(datos, "Referer: http://dominio.com/forum\r\n");
while (cookies.getline(cookie, 400) && strcmp(cookie, "") != 0)
{
strcat_s(datos, "Cookie: ");
strcat_s(datos, cookie);
strcat_s(datos, "\r\n");
}
strcat_s(datos, "Connection: keep-alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "\r\n\r\n");
cookies.close();

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
strcpy_s(datos, "");

clock_t tiempo = clock();
int recibido = 0;
char trozo[512];

while (1)
{
memset(trozo, 0, 512);
if ((clock() - tiempo) > 4000)
{
break;
}
else if ((recibido += recv(sock, trozo, 512, 0)) == -1)
{
printf("Error en un recv().");
exit(0);
break;
}
else
{
printf("%s", trozo);
strcat_s(datos, trozo);
}
}
closesocket(sock);
system("pause");
system("cls");
int tam = strlen(datos), i, j;
printf("\n\n\nrecibe %d\n\n", recibido);
printf("guardados %d\n\n", strlen(datos));
system("pause");
system("cls");
FILE *binario;
binario = fopen("binario.gz", "wb");
for (i = 0; i < tam; i++)
{
if ((datos[i] == '\r') &&
(datos[i + 1] == '\n') &&
(datos[i + 2] == '\r') &&
(datos[i + 3] == '\n'))
{
for (j = i + 4; j < tam; j++)
{
fwrite(&datos[j], sizeof(char), 1, binario);
printf("%c", datos[j]);
}
break;
}
}
fclose(binario);
system("pause");
//PARA DESCOMPRIMIRLO LO MEJOR LLAMAR A 7-ZIP
}
}


Bueno el content-length dice mandar 23000 pero yo solo soy capaz de recoger unos 11000 bytes, muevo el puntero por la cadena hasta llegar al body y alli empiezo a guardarlo en binario en el archivo .gz pero al usar 7-zip para descomprimirlo no tengo suerte no funciona de todas formas creo que no lo recibo todo, ¿que puede pasar? ¿sabéis algo? Muchas gracias.

He comprobado lo que guardo en el archivo y es justo lo que muestra el body que me manda el server es decir los bytes que recibo del body los estoy guardando en el gz y no los de cabecera, pero lo que digo, dice mandar 23000, recibo 12000 y guarda en la cadena con los strcat 11000 aprox se pierden muchos datos o que pasa?

alguna manera fiable de extraer todos los datos? Saludos.

Hola compañeros ya me he dado cuenta de donde surge la perdida de datos:

while (1)
{
memset(trozo, 0, 512);
/*if ((clock() - tiempo) > 4000)
{
break;
}*/
if ((recibido += recv(sock, trozo, 512, 0)) == -1)
{
printf("Error en un recv().");
exit(0);
break;
}
else
{
//printf("%s", trozo);
strcat_s(datos, trozo);
printf("%d recibido y guardado %d",recibido, strlen(datos));
system("pause");
}
}


Lo recibidoes mayor que lo guardado un byte ocuparía lo equivalente a un caracter.. mm pero bueno podría intentar escribirlo directamente en el archivo.. podría quizás.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Kaxperday

#6
Bueno bueno gente ya casi lo tengo he estado probando y he conseguido al descomprimir el gz que esta vez SI tiene el mismo tamaño del content-length una vez eliminada la cabecera:

<!DOCTYPE html>
<


El código empleado fue el siguiente, aunque el borrar la cabecera es manual (bloc de notas), lo que pasa es que al usar luego el gz me dice que el archivo está corrompido.


void descarga_foros()
{
WSADATA wsa;
SOCKET sock;
struct sockaddr_in directorio;
char datos[30000], cookie[1000];

WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Se ha producido un error al inicializar el socket.");
exit(0);
}
else
{
directorio.sin_family = AF_INET;
directorio.sin_port = htons(PUERTO);
directorio.sin_addr.s_addr = inet_addr(IP);

strcpy_s(datos, "POST /forum HTTP/1.1\r\n");
strcat_s(datos, "Host: dominio.com\r\n");
strcat_s(datos, "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\r\n");
strcat_s(datos, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n");
strcat_s(datos, "Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3\r\n");
strcat_s(datos, "Accept-Encoding: gzip, deflate\r\n");
strcat_s(datos, "Referer: http://dominio.com/forum\r\n");
strcat_s(datos, "Connection: keep-alive\r\n");
strcat_s(datos, "Cache-Control: max-age=0\r\n");
strcat_s(datos, "\r\n\r\n");

connect(sock, (struct sockaddr*)&directorio, sizeof(directorio));
send(sock, datos, strlen(datos), 0);
strcpy_s(datos, "");

int recibido = 0, i, j;
char trozo[512];

FILE *binario;
binario = fopen("binario.gz", "ab");

while (1)
{
memset(trozo, 0, 512);
if ((recibido = recv(sock, trozo, 512, 0)) == -1)
{
printf("Error en un recv().");
exit(0);
break;
}
else
{
for (i = 0; i < recibido; i++)
{
fwrite(&trozo[i], sizeof(char), 1, binario);
}
strcat_s(datos, trozo);
}
}
fclose(binario);
closesocket(sock);

//BORRARLE LA CABECERA Y LLAMAR A 7-ZIP.
//PARA DESCOMPRIMIRLO LO MEJOR LLAMAR A 7-ZIP
ofstream cookiez("cookies.txt");
int tam = strlen(datos);
char hookie[500];
for (i = 0; i < tam; i++)
{
if ((datos[i] == 'S') &&
(datos[i + 1] == 'e') &&
(datos[i + 2] == 't') &&
(datos[i + 3] == '-') &&
(datos[i + 4] == 'C') &&
(datos[i + 5] == 'o') &&
(datos[i + 6] == 'o') &&
(datos[i + 7] == 'k') &&
(datos[i + 8] == 'i') &&
(datos[i + 9] == 'e') &&
(datos[i + 10] == ':') &&
(datos[i + 11] == ' '))
{
i = i + 12;
j = 0;
while (datos[i] != ';')
{
cookie[j] = datos[i];
i++;
j++;
}
cookie[j] = '*';
j = 0;
for (int k = 0; k < strlen(cookie); k++)
{
if (cookie[k] != '*')
{
hookie[j] = cookie[k];
j++;
}
else
{
hookie[j] = '\0';
break;
}
}
cookiez << hookie << endl;
strcpy_s(cookie, "");
strcpy_s(hookie, "");
}
}
cookiez.close();
              ....................
system("pause");
}
}


He aislado los bytes, lo que hace el código es guardar todos los bytes que reciben los recv() en el archivo, y luego voy al archivo, elimino la cabecera con el bloc de notas y al descomprimir con el 7-zip me dice que esta corrompido y no me deja, ¿qué puede ser? el archivo  sin cabecera es del mismo tamaño que el content-length para mi sorpresa, entonces? Gracias.

Quizás eso de deflate tenga algo que ver pero aunque lo mande en el cliente o no la respuesta del server es gzip no gzip, deflate. Elige mandarmelo en gzip asi que sigo sin saberlo xp

Buenas noches.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.