<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
El 30/03/10 00:10, Adolfo Cárdenas escribió:
<blockquote
 cite="mid:ae8eff881003291510s74eb3c4jc3cc078f8cf5e034@mail.gmail.com"
 type="cite">
  <div>Gracias. </div>
  <div>Voy a buscar estos archivos. Aunque use libwmsock32.a
con winsock.h y tambien desaparecio el error</div>
  <div>. ¿También es recomendable programar con estos? La función que
estoy nhaciendo todavía no da el resultado que espero.</div>
  <div>Esta es la función que estoy tratando de hacer</div>
  <div>Lee una página web remota y muestra su contenido en MessageBoxes</div>
  <div> </div>
  <div>void leerpagina()<br>
{ <br>
 WSADATA wsadata;<br>
 struct sockaddr_in address; <br>
 struct hostent*hp; <br>
 int   sd; <br>
 char   *hostname,*request,*cp; <br>
 FILE   *local;<br>
 char   buff[BUFSIZ]; <br>
 int   i,l,nrv;<br>
 WSAStartup(0x0101,&wsadata);<br>
 hostname = "<a moz-do-not-send="true" href="http://www.mypagina.com/">www.mypagina.com</a>";
  <br>
 request = "/"; <br>
 hp = gethostbyname(hostname); <br>
 if (hp == NULL) { // do some error checking <br>
  MessageBox(NULL,"gethostbyname","",MB_OK); // herror(), NOT perror() <br>
  exit(1); <br>
 } <br>
 memcpy(&(address.sin_addr.s_addr),*(hp->h_addr_list),sizeof(struct
in_addr)); <br>
    <br>
 if(h_errno){ <br>
  MessageBox(NULL,"DNS error","",MB_OK); <br>
  exit(1); <br>
 } <br>
 address.sin_family = AF_INET; <br>
 address.sin_port = htons(80); <br>
 sd = socket(AF_INET,SOCK_STREAM,0); <br>
 if(sd == 0) exit(1); <br>
  </div>
</blockquote>
En caso de error, socket() devuelve -1, no 0 (que sería un valor de
respuesta válido).<br>
<br>
<blockquote
 cite="mid:ae8eff881003291510s74eb3c4jc3cc078f8cf5e034@mail.gmail.com"
 type="cite">
  <div> if(connect(sd,(struct sockaddr *)&(address),<br>
              sizeof(struct sockaddr_in)) == -1){ <br>
  MessageBox(NULL,"Connection failed","",MB_OK); <br>
  exit(1); <br>
 } else { <br>
  MessageBox(NULL,"connect() ejecutado con exito!","",MB_OK); <br>
 } <br>
 ///printf("\n\nGET %s HTTP/1.1\r\nHost: %s\r\nConnection:
close\r\n\r\n", request,hostname); <br>
 sprintf(buff,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection:
close\r\n\r\n", request,hostname); <br>
  </div>
</blockquote>
Aconsejaría usar snprintf(buff, BUFSIZ, para al menos asegurar que no
se produzca un buffer overflow.<br>
<br>
<blockquote
 cite="mid:ae8eff881003291510s74eb3c4jc3cc078f8cf5e034@mail.gmail.com"
 type="cite">
  <div> l = strlen(buff); <br>
  </div>
</blockquote>
sprintf() devuelve la longitud de la cadena, así que puedes asignarla
directamente a l, en vez de recorrerla de nuevo con strlen()<br>
<br>
<br>
<blockquote
 cite="mid:ae8eff881003291510s74eb3c4jc3cc078f8cf5e034@mail.gmail.com"
 type="cite">
  <div> send(sd,buff,l,0); <br>
  </div>
</blockquote>
Aunque poco probable, podría no enviar todos los datos de una sola vez.<br>
<br>
<blockquote
 cite="mid:ae8eff881003291510s74eb3c4jc3cc078f8cf5e034@mail.gmail.com"
 type="cite">
  <div> do{ <br>
  nrv = recv(sd,buff,BUFSIZ,0); <br>
  if(nrv > 0) MessageBox(NULL,buff,"",MB_OK); else   break; <br>
  </div>
</blockquote>
El valor que recibes no termina en \0, así que el uso de buff que haces
es incorrecto.<br>
Como mínimo necesitarías hacer buff[nrv] = '\0'; (y pasar a recv BUFSIZ
- 1 en vez de BUFSIZ).<br>
<br>
<blockquote
 cite="mid:ae8eff881003291510s74eb3c4jc3cc078f8cf5e034@mail.gmail.com"
 type="cite">
  <div> }while(1); <br>
  </div>
</blockquote>
Si el host remoto cierra la conexión/da un error, nrv será 0 ó -1, en
cuyo caso estás generando un bucle infinito.<br>
<br>
<blockquote
 cite="mid:ae8eff881003291510s74eb3c4jc3cc078f8cf5e034@mail.gmail.com"
 type="cite">
  <div> WSACleanup();    <br>
}</div>
  <div> </div>
  <div>//¿Podría decirme dónde está el error?</div>
  <div> </div>
  <div>/*Gracias.*/<br>
  </div>
</blockquote>
<br>
<br>
<blockquote type="cite">Perdón la librería que use es libwsock32.a y su
correspondiente <em>-lwsock32</em></blockquote>
<br>
Si no usas determinadas funciones de Winsock2 puedes usar perfectamente
winsock.h y <em>-lwsock32</em><br>
<br>
<br>
</body>
</html>