Autor
|
Tema: Error codificacion de caracteres? HTTP Download (Leído 3,195 veces)
|
Vaagish
Desconectado
Mensajes: 875
|
Buenas amigos! Alguien sabe porque no se pueden escribir ciertos caracteres con fopen? Aqui dejo el code y el error al final del mismo #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #pragma comment(lib, "ws2_32.lib")
#include <iostream> using namespace std;
#define DEFAULT_BUFLEN 1 #define PORT 80
WSADATA WSA; SOCKET Socket; SOCKADDR_IN Server; HOSTENT *Info; FILE *MyFile;
char *IP;
int Bytes; char Buffer[DEFAULT_BUFLEN]; int Bufflen = DEFAULT_BUFLEN;
DWORD WINAPI Descargar (void* Nada);
DWORD WINAPI Descargar (void* Nada) { do {
Bytes = recv(Socket, Buffer, Bufflen, 0);
if(Bytes > 0){ fputs(Buffer, MyFile); }
}while(Bytes > 0);
fclose(MyFile); return 0; }
int main() {
char *Request = "GET /img/cpp-logo.png HTTP/1.1\nhost: www.cplusplus.com\r\n\r\n"; unsigned int j = 0; MyFile = fopen("C:\\Imagen.txt","w"); int Res;
WSAStartup(MAKEWORD(2, 2), &WSA); Socket = socket(AF_INET, SOCK_STREAM, 0); Info = gethostbyname("www.cplusplus.com");
IP = inet_ntoa(*(struct in_addr*)(Info -> h_addr_list[0]));
Server.sin_family = AF_INET; Server.sin_port = htons(PORT); Server.sin_addr.s_addr = inet_addr(IP);
connect(Socket, (struct sockaddr*)&Server, sizeof(Server)); send(Socket, Request, strlen(Request), 0);
HANDLE Hand = CreateThread(NULL, 0, Descargar, NULL, NORMAL_PRIORITY_CLASS, NULL);
cin.get(); closesocket(Socket); return (EXIT_SUCCESS); } Bueno, el problema es que la respuesta del servidor es: HTTP/1.1 200 OK
Date: Tue, 01 Oct 2013 20:24:42 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 08 Mar 2011 09:51:17 GMT
ETag: "2b60065-2434-49df58db76f40"
Accept-Ranges: bytes
Content-Length: 9268
Connection: close
Content-Type: image/png
‰PNG
IHDRÆKkitEXtSoftwareAdobe ImageReadyqÉe<PLTEˆÍgüõÿñëÿ‹Ì…ƒ{©': ETC, ETC...(IMAGEN PNG) Bueno, con el editor de texto borro todo lo que tiene que ver con HTTP, pero aun asi, al abrir con el editor de texto la imagen descargada con el navegador web, veo que no es igual la codificacion, al parecer no "reconoce" ciertos caracteres al guardarlos en el archivo de texto, y corrompe el archivo.. Como podria solucionar esto ?? :/ Gracias!
|
|
|
En línea
|
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
Ahora que profundizo un poco mas en el code, me doy cuenta que me cambia todos los "\r\n" por "\n" o sea, el png original tiene "\r\n" y el mio solo "\n" como fin de linea... :/ tengo que recorrer el code y cambiarlo "a mano" ?? EDITADO: Pff,, Ahora entiendo que esto tiene que ver con el formato Unix y Windows... Estoy por enfermar,, podria funcionar algo asi? Que les parece? DWORD WINAPI Descargar (void* Nada) { char * Pos; do{ Bytes = recv(Socket, Buffer, Bufflen, 0); Pos = strstr(Buffer,"\r"); if(Pos){ strncpy(Pos,"\r\n",4); }
fwrite(Buffer, 1, Bytes, MyFile);
}while(Bytes > 0);
return 0; }
|
|
« Última modificación: 2 Octubre 2013, 00:53 am por Vaagish »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Supongamos que te llega ABC\nDEF
Tu strncpy dejaría la cadena tal que: ABC\r\n\EF
strncpy( Pos, "\r\n", 4 ) no desplaza lo que haya detrás... lo sobreescribe.
En cualquier caso, si tu quieres recuperar la imagen, y solo la imagen, tienes que eliminar toda la cabecera http que te envía el servidor y quedarte únicamente con el código de la imagen.
La respuesta del servidor no va a generar por si sola una imagen válida, ya que la cabecera http no está contemplada en ningún estándar de ficheros de imagen.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
La función "Descargar" la puedes acortar a: DWORD WINAPI Descargar(void *Nada) { int num_bytes; while ((num_bytes = recv(Socket, Buffer, Bufflen, 0)) > 0) fwrite(Buffer, 1, num_bytes, MyFile); return 0; }
También debes abrir el archivo en modo binario con "wb" y falta cerrarlo llamando a fclose. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
Gracias por las respuestas! La cabecera HTTP la pensaba eliminar con alguna funcion de cadenas, eso no me preocupa mucho.. el problema es la codificacion.. se supone que yo deba solucionarlo con codigo? me parece raro, porque es un archivo, no un texto.. no deberia de respetar el contenido del archivo binario tal cual es? sino como es que se pueden abrir archivos de imagen tanto en linux como en windows??? No lo entiendo.. Gracias! EDITADO: Listo! El problema era abrir el archivo como "w+" y no como "wb" como dice rir3760! Gracias again!
|
|
« Última modificación: 2 Octubre 2013, 19:32 pm por Vaagish »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Los archivos de imagen se basan en un estándar. Dicho estándar rige las normas de codificación. Entre esas normas se detallan los posibles saltos de línea.
Tu piensa que estos estándares van ligados al formato, no al sistema operativo, lo que permite que la imagen se pueda abrir y guardar sin problemas en cualquier sistema operativo.
|
|
|
En línea
|
|
|
|
Vaagish
Desconectado
Mensajes: 875
|
A modo de completar el tema.. por si alguien se ve en la misma situación.. para poder cortar la cabecera HTTP se puede buscar la siguiente secuencia (al menos en archivos binarios) "\r\n\r\n" pues entre la cabecera y la información binaria se dejan 2 espacios Saludos!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Preguntas con respecto a la codificación de caracteres.
Desarrollo Web
|
Aikanáro Anário
|
2
|
3,794
|
30 Junio 2011, 18:21 pm
por Aikanáro Anário
|
|
|
problemas con la codificación de carácteres en nodejs
Programación General
|
WHK
|
0
|
2,363
|
14 Diciembre 2012, 15:37 pm
por WHK
|
|
|
Codificación de caracteres APACHE 2.4.4
Desarrollo Web
|
JJMD
|
2
|
3,475
|
11 Julio 2013, 10:58 am
por JJMD
|
|
|
[Solucionado] [JS] Problema de codificación al enviar cadena con caracteres
Scripting
|
Car0nte
|
0
|
1,822
|
17 Abril 2014, 20:54 pm
por Car0nte
|
|
|
Obtener codificacion de caracteres de un archivo de texto en C
Programación C/C++
|
Token32
|
1
|
1,990
|
26 Julio 2014, 18:09 pm
por eferion
|
|