Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: someRandomCode en 3 Noviembre 2014, 01:41 AM

Título: [C/C++] WinAPI -> Sockets, me atore.. (resuelto)
Publicado por: someRandomCode en 3 Noviembre 2014, 01:41 AM
Hola, chicos, me siento mal ultimamente vengo solo a pedir ayuda y no a colaborar..
Tengo un script en PHP que me retorna la IP publica, desde una peticion POST.
El tema, es que no se donde estoy pifiandola porque aparentemente no estoy guardando el contenido de lo que me deberia guardar recv() (aclaro que estoy usando un puntero a funcion, por eso en el codigo se va a ver FuncionRecv()

Sin mas preambulos, el codigo:

char * IPPublica()
{
WSAData wsaData;
SOCKET Socket = INVALID_SOCKET;
int codigo_error = 0;
struct addrinfo *resultado = NULL,
*actual = NULL,
pistas;
char * ip = (char*)HeapAlloc(GetProcessHeap(),sizeof(char),513);
ZeroMemory(&ip,512);
char solicitud[512] =
"POST /Tracking/Tracker.php HTTP/1.1\r\n"
"User-Agent: Mozilla/4.0\r\n"
"Host: 127.0.0.1\r\n"
"Accept: */*\r\n"
"Cache-Control: no-cache\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Lenght: 4\r\n"
"ip=1\r\n";
codigo_error = FuncionWSAStartup(MAKEWORD(1,1),&wsaData);
if (codigo_error != 0) {
FuncionMessageBox(NULL,"Error al inicializar WSA1,1","prueba",MB_OK);
FuncionWSACleanup();
return NULL;
}
ZeroMemory(&pistas,sizeof(pistas));
pistas.ai_family = AF_UNSPEC;
pistas.ai_socktype = SOCK_STREAM;
pistas.ai_protocol = IPPROTO_TCP;

codigo_error = FuncionGetAddrInfo("127.0.0.1","80",&pistas,&resultado);
if (codigo_error != 0 ) {
FuncionMessageBox(NULL,"Error al obtener el nombre del host","prueba",MB_OK);
FuncionWSACleanup();
return NULL;
}
for (actual = resultado; actual != NULL; actual = actual->ai_next)
{
Socket = FuncionSocket(actual->ai_family,actual->ai_socktype,actual->ai_protocol);
if (Socket == INVALID_SOCKET) {
FuncionMessageBox(NULL,"Fallo el socket","prueba",MB_OK);
FuncionWSACleanup();
return NULL;
}
codigo_error = FuncionConnect(Socket,actual->ai_addr,(int)actual->ai_addrlen);
if (codigo_error == SOCKET_ERROR) {
FuncionCloseSocket(Socket);
Socket = INVALID_SOCKET;
continue;
}
break;
}
FuncionFreeAddrInfo(resultado);

codigo_error = FuncionSend(Socket,solicitud,strlen(solicitud),0);
if (codigo_error == SOCKET_ERROR) {
FuncionMessageBox(NULL,"Error al enviar","Prueba",MB_OK);
FuncionCloseSocket(Socket);
FuncionWSACleanup();
return NULL;
}
codigo_error = FuncionShutdown(Socket,SD_SEND);
do {
codigo_error = FuncionRecv(Socket,ip,512,0);
FuncionMessageBox(NULL,ip,"Prueba",MB_OK);
if (codigo_error >0)
FuncionMessageBox(NULL,"Recibiedo..","Prueba",MB_OK);
else if (codigo_error==0)
FuncionMessageBox(NULL,"Conexion cerrada..","Prueba",MB_OK);
else {
char error[10] = "";
_itoa_s(FuncionWSAGetLastError(),error,10);
FuncionMessageBox(NULL,error,"Prueba",MB_OK);
}
} while(codigo_error > 0);
FuncionCloseSocket(Socket);
FuncionWSACleanup();
return ip;
}


Esta hecho muy a las apuradas.. La verdad que tendria que haberlo hecho todo con Qt que estoy acostumbrado.. Pero se me dio por hacerlo todo con la WinAPI (que sufrimiento, pero ya llevo demasiado escrito como para hechar para atras y de paso aprendo..)

Se que me va a devolver el codigo de 200 OK mas los datos, pero tiene todas esas comprobaciones porque en el buffer(ip) no logro obtener ningun contenido :(
Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: daryo en 3 Noviembre 2014, 01:53 AM

no he visto detalladamente el codigo pero :

que pasa si pones :

pistas.ai_family = AF_INET;


en ves de:
pistas.ai_family = AF_UNSPEC;
Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: someRandomCode en 3 Noviembre 2014, 02:01 AM
Cita de: daryo en  3 Noviembre 2014, 01:53 AM
no he visto detalladamente el codigo pero :

que pasa si pones :

pistas.ai_family = AF_INET;


en ves de:
pistas.ai_family = AF_UNSPEC;

Le di derecho como dice la MSDN en ese apartado, aparte la conexion la realiza con exito, lo que hace mal es el tema de guardar los datos en el buffer (que directamente no lo hace)
No se si tendra algo que ver con como tengo definido el puntero a funcion, lo adjunto por las dudas:

int (__stdcall *FuncionRecv)(SOCKET,char *,int,int);
FuncionRecv = (int(__stdcall*)(SOCKET,char *,int,int))FuncionGetProcAddr(winsock,"recv");

Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: daryo en 3 Noviembre 2014, 02:10 AM
si tienes razon error mio :P


Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: someRandomCode en 3 Noviembre 2014, 03:30 AM
Me pone de mal humor porque por lo general pongo metas a lograr antes de irme a dormir, y esta era una de esas metas :P
No voy a poder dormir tranquilo jaja
Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: Eternal Idol en 3 Noviembre 2014, 09:34 AM
char * ip = (char*)HeapAlloc(GetProcessHeap(),sizeof(char),513);
ZeroMemory(&ip,512);

Ahi estas escribiendo en ip (la variable local en la pila y todos los bytes siguientes) y no en la memoria a la que ip apunta, por lo que cuando llames a recv sera un puntero nulo, tenes suerte de que no haya una excepcion no controlada ahi mismo. En fin, saca el ampersand que esta de mas ...
Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: someRandomCode en 3 Noviembre 2014, 13:42 PM
Tenes razon, le pifie, igual lo cambie por:

char * buffer1 = (char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,4096*sizeof(char));


Porque ahi tenia un error tambien, el tema tambien encontre por que la respuesta no llegaba, el servidor estaba esperando un terminador valido, mi peticion POST esta incorrecta, alguien me puede dar una mano al respecto de que me falta o que tengo incorrecto en la peticion?
EDIT: Me olvide de poner la peticion como esta actualmente, es esta:

char solicitud[512] =
"POST /Tracking/Tracker.php HTTP/1.1\r\n"
"Host: 127.0.0.1\r\n"
"Connection: keep-alive\r\n"
"Content-Lenght: 4\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"\r\n"
"ip=1\r\n";
"\r\n\r\n";


Me responde con 200  (o sea, OK) peeeero, no me da el resultado me dice no implementado cuando con Chrome y postman me da la respuesta correcta
Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: Eternal Idol en 3 Noviembre 2014, 14:40 PM
Cita de: someRandomCode en  3 Noviembre 2014, 13:42 PMTenes razon, le pifie, igual lo cambie por:

Si, no habia visto, de casualidad le dabas HEAP_NO_SERIALIZE (sizeof char = 1).

Esto esta mal escrito:
"Content-Lenght: 4\r\n"

Es Content-Length no Content-Lenght. Igual si es un tema de protocolo, segui probando hasta que des en el clavo y mandes lo que corresponde.
Título: Re: [C/C++] WinAPI -> Sockets, me atore..
Publicado por: someRandomCode en 3 Noviembre 2014, 14:48 PM
Cita de: Eternal Idol en  3 Noviembre 2014, 14:40 PM
Si, no habia visto, de casualidad le dabas HEAP_NO_SERIALIZE (sizeof char = 1).

Esto esta mal escrito:
"Content-Lenght: 4\r\n"

Es Content-Length no Content-Lenght. Igual si es un tema de protocolo, segui probando hasta que des en el clavo y mandes lo que corresponde.


Etaaaa, ahi estaba otro typo :)
Gracias che ahi lo marco como resuelto
Título: Re: [C/C++] WinAPI -> Sockets, me atore.. (resuelto)
Publicado por: Eternal Idol en 3 Noviembre 2014, 14:54 PM
De nadas  ::)
Título: Re: [C/C++] WinAPI -> Sockets, me atore.. (resuelto)
Publicado por: Borito30 en 25 Septiembre 2016, 17:57 PM
perdona este script funciona con un formulario o se pone desde una pagina, podrias dar mas detalles? :huh: grax
Título: Re: [C/C++] WinAPI -> Sockets, me atore.. (resuelto)
Publicado por: AlbertoBSD en 25 Septiembre 2016, 18:17 PM
El tema es de hace 2 años.

El script mostrado envia una peticion POST a una pagina web.

Saludos