Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Riki_89D en 11 Octubre 2011, 10:20 am



Título: recv() socket error?
Publicado por: Riki_89D en 11 Octubre 2011, 10:20 am
Hola que ta? intento recivir la respuesta despues de llamar a send(),pero no da resultado:


este es el codigo que teoircamente tendria que lee :S

Código
  1. send(Sock,Cabecera,strlen(Cabecera),0);
  2. send(Sock,Datos,strlen(Datos),0);
  3. int ax;
  4. HANDLE File = CreateFile("Pagina.html",GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  5.   do{
  6.   ax = recv(Sock,Buff,sizeof(Buff),0);
  7.   WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
  8.   } while(ax != 0);
  9.  
  10.  


aqui todo el code :S


Código
  1. #include "windows.h"
  2. #include "iostream"
  3.  
  4. #pragma comment(lib,"ws2_32.lib")
  5.  
  6. #define PORT_CONNECT 80
  7.  
  8. SOCKET Sock;
  9. int conexion = 0x0;
  10. struct sockaddr_in Server_Web;
  11. WSADATA wsa;
  12. char Buff[1000];
  13. DWORD Bytes_Read = 0;
  14. DWORD Bytes_Write = 0;
  15.  
  16. char Cabecera[] = "POST /login2.html HTTP/1.1\r\n"
  17. "Content-Type: application/x-www-form-urlencoded\r\n"
  18. "Host: foro.elhacker.net\r\n"
  19. "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n"
  20. "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
  21. "Accept-Language: en-us,en;q=0.5\r\n"
  22. "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
  23. "Connection: keep-alive\n"
  24. "Referer: http://foro.elhacker.net/login.html \r\n"
  25. "Cookie: __utma=;PHPSESSID=;\n";
  26.  
  27. char Datos[] = "user=USER&passwrd=PASS";
  28.  
  29. int main(void)
  30. {
  31. if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
  32. {
  33. std::cout << "Error al crear instancia" <<std::endl;
  34. getchar();
  35. }
  36.  
  37. Sock = socket(AF_INET,SOCK_STREAM,0);
  38. if(Sock == INVALID_SOCKET)
  39. {
  40. std::cout << "Error al crear el socket" <<std::endl;
  41. getchar();
  42. }
  43.  
  44. Server_Web.sin_family = AF_INET;
  45. Server_Web.sin_port = htons(PORT_CONNECT);
  46. Server_Web.sin_addr = *((in_addr*)gethostbyname("foro.elhacker.net")->h_addr);
  47. memset(Server_Web.sin_zero,0,8);
  48.  
  49. conexion = connect(Sock,(sockaddr*)&Server_Web,sizeof(sockaddr));
  50.  
  51. if(conexion == -1)
  52. {
  53. std::cout << "Error al conectar" <<std::endl;
  54. getchar();
  55. closesocket(Sock);
  56. WSACleanup();
  57. }
  58.  
  59. send(Sock,Cabecera,strlen(Cabecera),0);
  60. send(Sock,Datos,strlen(Datos),0);
  61. int ax;
  62. HANDLE File = CreateFile("Pagina.html",GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  63.   do{
  64.   ax = recv(Sock,Buff,sizeof(Buff),0);
  65.   WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
  66.   } while(ax != 0);
  67.  
  68.  
  69.  
  70.  
  71.  
  72. return 0x0;
  73. }
  74.  
  75.  


Conectar conecta,pero leer no....:(


gracias cualquier ayuda sera buena


Título: Re: recv() socket error?
Publicado por: naderST en 13 Octubre 2011, 21:27 pm
Citar
Return value
If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.
Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Revisa la condicion del while() ... Pienso que se deberia salir del bucle.


Título: Re: recv() socket error?
Publicado por: Riki_89D en 13 Octubre 2011, 22:18 pm
Hola,la verdad no entiendo muy bien,dice que si la conexions e cierra este devuelve 0,lo comprobe con un IF pero 0 no devuelvw,tambien lo comprobe con SOCKET_ERROR + WSAGetLastError() pero no hace nada,es como si el programa se quedara encallado en la funcion recv y de alli no lo mueve nadie :(


aqui esta la parte modificada:

Código
  1. do{
  2.  ax = recv(Sock,Buff,sizeof(Buff),0);
  3.  if(ax == SOCKET_ERROR)
  4.  {
  5.  std::cout << WSAGetLastError();
  6.  getchar();
  7.  }
  8.  WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
  9.  
  10.  
  11.  } while(ax != 0);
  12.  

y perdona mi ignorancia ee :S se que deberia salir del bucle pero nose como hacerlo,ya que se queda el programa estancado alli en recv :S


Título: Re: recv() socket error?
Publicado por: naderST en 14 Octubre 2011, 03:36 am
Haz un bucle infinito y comprueba cuando recv() devuelva mayor que cero. Lo que puede pasar en tu caso es que recv devuelva 0 porque no está recibiendo nada de momento y esto hace que se salga del while()


Título: Re: recv() socket error?
Publicado por: Riki_89D en 14 Octubre 2011, 19:07 pm
Por que motivo no recive nada el socket?¿ que raro no? ninguna de las funciones como connect o socket() da error :S


Título: Re: recv() socket error?
Publicado por: naderST en 14 Octubre 2011, 19:56 pm
Porque puede que en determinado momento no esté recibiendo nada desde el servidor...


Título: Re: recv() socket error?
Publicado por: Riki_89D en 14 Octubre 2011, 21:09 pm
Ok,bueno voy a probar lo del bucle infinitio y te cuento gracias ^^




ADJUNTO:

Acabo de probar lo del bucle infinito,lo tengo de esta manera:

Código
  1.  
  2. send(Sock,Cabecera,strlen(Cabecera),0);
  3. send(Sock,Datos,strlen(Datos),0);
  4.  
  5. while(1)
  6. {
  7.  
  8. REC = recv(Sock,Buff,sizeof(Buff),0);
  9. if(REC > 0)
  10. {
  11.  WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
  12.  break;
  13. }
  14.  
  15. }
  16.  
  17.  

Pero no hace nada...no recibe nada,se queda parado el programa y ya no hace nada mas,pero hay una cosa que me llama la atencion,y e sla cabecera que envio,fijate:

Código
  1. char Cabecera[] = "POST /login2.html HTTP/1.1\r\n"
  2. "Content-Type: application/x-www-form-urlencoded\n";
  3.  
  4. char Datos[] = "user=USER&passwrd=PASS";
  5.  

"Cabecera" contiene la peticion HTTP
"Datos" los datos de usuario

y si te fijas ago 2 Send();,es decir,llamo 2 veces a esa funcion,quizas tenga que hacer 2 recv() para conseguir leer ekl documento HTML no?¿



gracias de antemano