Avatar billede egede Nybegynder
04. november 2003 - 17:25 Der er 14 kommentarer og
1 løsning

Hente tekst fra hjemmeside

Jeg har brug for at hente noget tekst i fra en hjemmeside, hvordan gør jeg?

Og vær sød ved mig, for jeg er rimelig meget newbie inden for dette sprog :)
Avatar billede lars_dalsgaard Nybegynder
04. november 2003 - 17:27 #1
marker det tekst du skal bruge, højreklik derefter på det tryk kopier, og du kan så højreklikke og trykke "sæt ind" i f.eks word!
Avatar billede arne_v Ekspert
04. november 2003 - 17:27 #2
Eksempel:

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

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,"/");
  return 0;
}
Avatar billede arne_v Ekspert
04. november 2003 - 17:28 #3
Hvis du er helt ny til C/C++ så vil jeg sige at det er en lidt stor
opgave at starte med socket programmering.
Avatar billede arne_v Ekspert
04. november 2003 - 17:28 #4
lars dalsgaard>

Har du bemærket kategorien ?
Avatar billede egede Nybegynder
04. november 2003 - 19:53 #5
arne_v -> Tak, jeg vil teste det senere... Jeg har aldrig arbejdet med socket-programmering før... Men jeg skal også kun bruge det i et engangstilfælde...
Avatar billede arne_v Ekspert
04. november 2003 - 20:29 #6
Lad dig ikke narre af at der står POST i kommentarer - det er en GET -
kommentarerne er bare ikke blever rettet til.
Avatar billede egede Nybegynder
04. november 2003 - 21:05 #7
Min compiler kan ikke finde unistd.h...
Avatar billede arne_v Ekspert
04. november 2003 - 21:12 #8
Windows compiler !!!!

Erstat includerne med følgende:

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

#include <windows.h>
#include <errno.h>

og erstat close med closesocket !
Avatar billede egede Nybegynder
04. november 2003 - 21:32 #9
Ja, jeg må vist nok indrømme at jeg stadig bruger Windows... :)´

Når jeg eksekverer får jeg
Error creating socket: Error 0
Kan du hjælpe med den?
Jeg har Windows 2k m/SP4 hvis det skal bruges. Jeg forhøjer desuden pointsatsen.
Avatar billede arne_v Ekspert
04. november 2003 - 22:08 #10
Det er mig der er en spade.

Prøv med den her:

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

#include <windows.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;
  }
  resp[ix]='\0';
  printf("%s",resp);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.eksperten.dk",80,"/");
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
04. november 2003 - 22:09 #11
Jeg havde glemt de der WSA kald på Windows.
Avatar billede egede Nybegynder
04. november 2003 - 22:18 #12
Det virkede fint. Tak for hjælpen!
Avatar billede egede Nybegynder
04. november 2003 - 22:24 #13
Hvordan henter jeg fra et specifikt link? Hvis jeg ikke bare indtaster et domænenavn kan den ikke finde siden.
Avatar billede arne_v Ekspert
04. november 2003 - 22:26 #14
Det 3. argument er path'en.

get("www.eksperten.dk",80,"/spm/423169");

burde hente dette spørgsmål !
Avatar billede egede Nybegynder
05. november 2003 - 22:01 #15
tak for det.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis