[C/C++] WinAPI -> Sockets, me atore.. (resuelto)

Iniciado por someRandomCode, 3 Noviembre 2014, 01:41 AM

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

someRandomCode

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 :(

daryo


no he visto detalladamente el codigo pero :

que pasa si pones :

pistas.ai_family = AF_INET;


en ves de:
pistas.ai_family = AF_UNSPEC;
buenas

someRandomCode

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");


daryo

buenas

someRandomCode

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

Eternal Idol

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 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

someRandomCode

#6
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

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

someRandomCode

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

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón