[C con Clase] sockets
Programante
programante en gmail.com
Mar Abr 6 23:41:23 CEST 2010
El 30/03/10 00:10, Adolfo Cárdenas escribió:
> Gracias.
> Voy a buscar estos archivos. Aunque use libwmsock32.a con winsock.h y
> tambien desaparecio el error
> . ¿También es recomendable programar con estos? La función que estoy
> nhaciendo todavía no da el resultado que espero.
> Esta es la función que estoy tratando de hacer
> Lee una página web remota y muestra su contenido en MessageBoxes
>
> void leerpagina()
> {
> WSADATA wsadata;
> struct sockaddr_in address;
> struct hostent*hp;
> int sd;
> char *hostname,*request,*cp;
> FILE *local;
> char buff[BUFSIZ];
> int i,l,nrv;
> WSAStartup(0x0101,&wsadata);
> hostname = "www.mypagina.com <http://www.mypagina.com/>";
> request = "/";
> hp = gethostbyname(hostname);
> if (hp == NULL) { // do some error checking
> MessageBox(NULL,"gethostbyname","",MB_OK); // herror(), NOT perror()
> exit(1);
> }
> memcpy(&(address.sin_addr.s_addr),*(hp->h_addr_list),sizeof(struct
> in_addr));
>
> if(h_errno){
> MessageBox(NULL,"DNS error","",MB_OK);
> exit(1);
> }
> address.sin_family = AF_INET;
> address.sin_port = htons(80);
> sd = socket(AF_INET,SOCK_STREAM,0);
> if(sd == 0) exit(1);
En caso de error, socket() devuelve -1, no 0 (que sería un valor de
respuesta válido).
> if(connect(sd,(struct sockaddr *)&(address),
> sizeof(struct sockaddr_in)) == -1){
> MessageBox(NULL,"Connection failed","",MB_OK);
> exit(1);
> } else {
> MessageBox(NULL,"connect() ejecutado con exito!","",MB_OK);
> }
> ///printf("\n\nGET %s HTTP/1.1\r\nHost: %s\r\nConnection:
> close\r\n\r\n", request,hostname);
> sprintf(buff,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection:
> close\r\n\r\n", request,hostname);
Aconsejaría usar snprintf(buff, BUFSIZ, para al menos asegurar que no se
produzca un buffer overflow.
> l = strlen(buff);
sprintf() devuelve la longitud de la cadena, así que puedes asignarla
directamente a l, en vez de recorrerla de nuevo con strlen()
> send(sd,buff,l,0);
Aunque poco probable, podría no enviar todos los datos de una sola vez.
> do{
> nrv = recv(sd,buff,BUFSIZ,0);
> if(nrv > 0) MessageBox(NULL,buff,"",MB_OK); else break;
El valor que recibes no termina en \0, así que el uso de buff que haces
es incorrecto.
Como mínimo necesitarías hacer buff[nrv] = '\0'; (y pasar a recv BUFSIZ
- 1 en vez de BUFSIZ).
> }while(1);
Si el host remoto cierra la conexión/da un error, nrv será 0 ó -1, en
cuyo caso estás generando un bucle infinito.
> WSACleanup();
> }
>
> //¿Podría decirme dónde está el error?
>
> /*Gracias.*/
> Perdón la librería que use es libwsock32.a y su correspondiente
> /-lwsock32/
Si no usas determinadas funciones de Winsock2 puedes usar perfectamente
winsock.h y /-lwsock32/
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100406/5edeb6f1/attachment.html>
Más información sobre la lista de distribución Cconclase