<!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>