[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