recv() socket error?

Iniciado por Riki_89D, 11 Octubre 2011, 10:20 AM

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

Riki_89D

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 (cpp) [Seleccionar]

send(Sock,Cabecera,strlen(Cabecera),0);
send(Sock,Datos,strlen(Datos),0);
int ax;
HANDLE File = CreateFile("Pagina.html",GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  do{
  ax = recv(Sock,Buff,sizeof(Buff),0);
  WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
  } while(ax != 0);
 



aqui todo el code :S


Código (cpp) [Seleccionar]

#include "windows.h"
#include "iostream"

#pragma comment(lib,"ws2_32.lib")

#define PORT_CONNECT 80

SOCKET Sock;
int conexion = 0x0;
struct sockaddr_in Server_Web;
WSADATA wsa;
char Buff[1000];
DWORD Bytes_Read = 0;
DWORD Bytes_Write = 0;

char Cabecera[] = "POST /login2.html HTTP/1.1\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Host: foro.elhacker.net\r\n"
"User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Accept-Language: en-us,en;q=0.5\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
"Connection: keep-alive\n"
"Referer: http://foro.elhacker.net/login.html \r\n"
"Cookie: __utma=;PHPSESSID=;\n";

char Datos[] = "user=USER&passwrd=PASS";

int main(void)
{
if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
{
std::cout << "Error al crear instancia" <<std::endl;
getchar();
}

Sock = socket(AF_INET,SOCK_STREAM,0);
if(Sock == INVALID_SOCKET)
{
std::cout << "Error al crear el socket" <<std::endl;
getchar();
}

Server_Web.sin_family = AF_INET;
Server_Web.sin_port = htons(PORT_CONNECT);
Server_Web.sin_addr = *((in_addr*)gethostbyname("foro.elhacker.net")->h_addr);
memset(Server_Web.sin_zero,0,8);

conexion = connect(Sock,(sockaddr*)&Server_Web,sizeof(sockaddr));

if(conexion == -1)
{
std::cout << "Error al conectar" <<std::endl;
getchar();
closesocket(Sock);
WSACleanup();
}

send(Sock,Cabecera,strlen(Cabecera),0);
send(Sock,Datos,strlen(Datos),0);
int ax;
HANDLE File = CreateFile("Pagina.html",GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  do{
  ax = recv(Sock,Buff,sizeof(Buff),0);
  WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
  } while(ax != 0);
 
 



return 0x0;
}




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


gracias cualquier ayuda sera buena

naderST

CitarReturn 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.

Riki_89D

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 (cpp) [Seleccionar]

do{
  ax = recv(Sock,Buff,sizeof(Buff),0);
  if(ax == SOCKET_ERROR)
  {
  std::cout << WSAGetLastError();
  getchar();
  }
  WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
 

  } while(ax != 0);


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

naderST

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

Riki_89D

Por que motivo no recive nada el socket?¿ que raro no? ninguna de las funciones como connect o socket() da error :S

naderST

Porque puede que en determinado momento no esté recibiendo nada desde el servidor...

Riki_89D

#6
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 (cpp) [Seleccionar]


send(Sock,Cabecera,strlen(Cabecera),0);
send(Sock,Datos,strlen(Datos),0);
 
while(1)
{

REC = recv(Sock,Buff,sizeof(Buff),0);
if(REC > 0)
{
  WriteFile(File,Buff,sizeof(Buff),&Bytes_Write,0);
  break;
}
 
}
 


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 (cpp) [Seleccionar]

char Cabecera[] = "POST /login2.html HTTP/1.1\r\n"
"Content-Type: application/x-www-form-urlencoded\n";

char Datos[] = "user=USER&passwrd=PASS";


"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