Avatar billede kamikaze Nybegynder
24. september 2003 - 11:24 Der er 8 kommentarer og
1 løsning

Hent HTML side udfra URL

Hej.

Er der nogen der ligger inde med kode/tutorials/eksempler på hvordan man henter HTML-koden fra en URL.

Går ud fra at man skal åbne en socket på port 80 og sende en GET request...?

OS: UNIX, Sun Solaris
Avatar billede arne_v Ekspert
24. september 2003 - 12:14 #1
Eksempel:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/socket.h>
#include <netdb.h>

#include <unixio.h>
#include <errno.h>

void get(char *hostname,int port,char *path)
{
  int sd,status,len,ix,tmp;
  char cmd[512],resp[51200];
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  /* create socket */
  sd=socket(AF_INET,SOCK_STREAM,0);
  if(sd<0) {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  /* bind socket */
  local.sa_family=AF_INET;
  memset(local.sa_data,0,sizeof(local.sa_data));
  status=bind(sd,&local,sizeof(local));
  if(status<0) {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  /* lookup host */
  hostinfo=gethostbyname(hostname);
  if(!hostinfo) {
      printf("Error looking up host: %s\n",hostname);
      goto fin;
  }
  /* connect to host */
  remote.sa_family=hostinfo->h_addrtype;
  memcpy(remote.sa_data+2,hostinfo->h_addr_list[0],hostinfo->h_length);
  *((short *)remote.sa_data)=port;
  tmp=remote.sa_data[0];
  remote.sa_data[0]=remote.sa_data[1];
  remote.sa_data[1]=tmp;
  status=connect(sd,&remote,sizeof(remote));
  if(status!=0) {
      printf("Error connecting to host: %s port: %d\n",hostname,port);
      goto fin;
  }
  /* send POST request */
  sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",path,hostname);
  status=send(sd,cmd,strlen(cmd),0);
  if(status<0) {
      printf("Error sending POST request\n");
      goto fin;
  }
  /* read response */
  ix=0;
  while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
      ix = ix + len;
      printf("*\n");
  }
  resp[ix]='\0';
  printf("%s",resp);
fin:
  close(sd);
  return;
}

int main(int argc,char *argv[])
{
  get("www.xxxx.dk",80,"/");
}
Avatar billede arne_v Ekspert
24. september 2003 - 12:15 #2
Ovenstående er testet på Linux og VMS. Det bør også virke på Solaris.
Avatar billede kamikaze Nybegynder
24. september 2003 - 12:44 #3
Jeg får flg.:

socket_get.cpp:8:20: unixio.h: No such file or directory
socket_get.cpp: In function `void get(char*, int, char*)':
socket_get.cpp:65: `CLOSE' undeclared (first use this function)
Avatar billede kamikaze Nybegynder
24. september 2003 - 12:46 #4
Hvad er indeholdt i unixio.h, og er det en standard header der burde være der?

(er ikke specielt bekendt med UNIX)
Avatar billede arne_v Ekspert
24. september 2003 - 13:06 #5
Det er vist en ældre version jeg fandt frem.

Erstat #include'erne med disse:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#include <sys/socket.h>
#include <fcntl.h>
#include <netdb.h>
#include <errno.h>
Avatar billede kamikaze Nybegynder
24. september 2003 - 13:10 #6
Det hjalp, men der er stadig en undeclared identifier: 'CLOSE'. Skulle CLOSE være med i et lib. eller er det din egen function?
Avatar billede arne_v Ekspert
24. september 2003 - 13:47 #7
close burde være i unistd.h !
Avatar billede arne_v Ekspert
24. september 2003 - 13:47 #8
Prøv evt. "man close" og check hvor Solaris gemmer den.
Avatar billede kamikaze Nybegynder
24. september 2003 - 14:29 #9
Ok, det ser ud til at virke nu.

TNX :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester