Autor
|
Tema: [C/C++] WinAPI -> Sockets, me atore.. (resuelto) (Leído 6,348 veces)
|
someRandomCode
Desconectado
Mensajes: 250
|
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
|
|
« Última modificación: 3 Noviembre 2014, 14:48 pm por someRandomCode »
|
En línea
|
|
|
|
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;
|
|
|
En línea
|
buenas
|
|
|
someRandomCode
Desconectado
Mensajes: 250
|
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");
|
|
|
En línea
|
|
|
|
daryo
|
si tienes razon error mio
|
|
|
En línea
|
buenas
|
|
|
someRandomCode
Desconectado
Mensajes: 250
|
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 No voy a poder dormir tranquilo jaja
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
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 ...
|
|
|
En línea
|
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
Desconectado
Mensajes: 250
|
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
|
|
« Última modificación: 3 Noviembre 2014, 13:48 pm por someRandomCode »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Tenes 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-Leng th no Content-Leng ht. Igual si es un tema de protocolo, segui probando hasta que des en el clavo y mandes lo que corresponde.
|
|
|
En línea
|
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
Desconectado
Mensajes: 250
|
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
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
De nadas
|
|
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Equivalencia de función WINAPI unsigned int WINAPI myRun en Windows con Ubuntu
Programación C/C++
|
bertamax
|
2
|
3,137
|
7 Agosto 2010, 16:27 pm
por bertamax
|
|
|
Añadir sockets en winapi
Programación C/C++
|
d00ze13
|
2
|
2,835
|
30 Noviembre 2011, 20:00 pm
por d00ze13
|
|
|
[Resuelto] C++ Sockets
Programación C/C++
|
NOIS
|
4
|
3,000
|
9 Noviembre 2014, 14:05 pm
por NOIS
|
|
|
[RESUELTO] Regresando, me atoré (Ollydbg 2.01 + crackit2 de netforce.nl)
« 1 2 3 »
Ingeniería Inversa
|
someRandomCode
|
20
|
11,283
|
30 Agosto 2015, 12:24 pm
por someRandomCode
|
|
|
[Resuelto] ¿Por qué mis sockets en nodejs no funcionan?
Desarrollo Web
|
Ali Baba
|
1
|
1,685
|
29 Marzo 2018, 20:30 pm
por ivancea96
|
|