Avatar billede Kristian H Nybegynder
19. februar 2004 - 20:48 Der er 13 kommentarer og
1 løsning

Webpage last modified

Hej

Ville lige høre om det var muligt at finde ud af hvornår en fil (*.txt, *.html osv.) på nettet sidst er blevet opdateret?!
(Benytter C++ Builder 5)

-TuDack
Avatar billede bertelbrander Novice
19. februar 2004 - 20:59 #1
Er det HTTP, FTP, eller ?
Avatar billede Kristian H Nybegynder
19. februar 2004 - 21:10 #2
HTTP
Avatar billede arne_v Ekspert
19. februar 2004 - 21:17 #3
Du sende en HTTP request og ser om der kommer en "Last-Modified" header.

Hvis der gør det kan du bruge den.
Avatar billede Kristian H Nybegynder
19. februar 2004 - 21:31 #4
Arne_v
Måske ligger du inde med et eksempel?
Avatar billede arne_v Ekspert
19. februar 2004 - 21:41 #5
Ikke med nogen smart Borland komponent, men med god gammeldages winsock har
jeg lavet følgende eksempel (det er bare en lettere modficeret udgave af noget kode
jeg ofte har postet her):

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

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

#define KEYWORD "Last-Modified: "

void get(char *hostname,int port,char *path)
{
  int sd,status,len,ix,tmp;
  char cmd[512],resp[51200],*p1,*p2,hdrbuf[100];
  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 GET 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 GET 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';
  p1 = strstr(resp,KEYWORD);
  p1 += strlen(KEYWORD);
  p2 = strpbrk(p1,"\r\n");
  strncpy(hdrbuf,p1,p2-p1);
  hdrbuf[p2-p1] = '\0';
  printf("%s %s\n",KEYWORD,hdrbuf);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.xxx.dk",80,"/index.html");
  WSACleanup();
  return 0;
}
Avatar billede Kristian H Nybegynder
19. februar 2004 - 21:49 #6
Et par fejl når jeg prøver at compile:

1) Undefined structure 'sockaddr'
2) Size of 'local' is unknows or zero
Avatar billede arne_v Ekspert
19. februar 2004 - 21:54 #7
Hm - jeg testede med 5.5 command line.

Gad vide hvor de har smidt struct sockaddr henne i 5.0 ...
Avatar billede arne_v Ekspert
19. februar 2004 - 21:56 #8
Du må nok lige søge lidt i include filerne efter den.
Avatar billede bertelbrander Novice
19. februar 2004 - 21:59 #9
winsock.h eller winsock2.h?
Avatar billede arne_v Ekspert
19. februar 2004 - 22:01 #10
Godt gæt.

Men winsock.h burde vel være inkluderet i windows.h !??
Avatar billede arne_v Ekspert
06. marts 2004 - 15:34 #11
Har du fået det til at virke ?
Avatar billede Kristian H Nybegynder
06. marts 2004 - 17:27 #12
Sorry den lange ventetid, har været meget optaget....
Ja det virker, men programmet bruger op til 5 min på at komme med et svar, hvordan kan det være?
Avatar billede arne_v Ekspert
06. marts 2004 - 17:36 #13
Ikke umiddelbart.
Avatar billede arne_v Ekspert
06. marts 2004 - 17:38 #14
Men prøv at erstatte

  while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
      ix = ix + len;
  }

med

  while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
      ix = ix + len;
      if(strsr(resp,KEYWORD)!=NULL && strsr(resp,KEYWORD)<(resp+ix)) break;
  }
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