Avatar billede kroxx Nybegynder
07. marts 2006 - 18:01 Der er 11 kommentarer og
1 løsning

Tjekke om fil eksisterer på webserver

Jeg vil gerne lave et lille program der står og tjekker en forbindelse til nogle webservere. Nogen der kan være behjælpelig med hvordan jeg tjekker en forbindelse til en fil webserver? (f.eks. eksisterer http://xx.xx.xx.xx/images/test.gif)

Takker,
KroxX
Avatar billede arne_v Ekspert
07. marts 2006 - 18:18 #1
du sender en HTTP request

jeg har postet socket kode som goer det mange gange baade i windows og i linux version
hvis du ikke kan finde det saa skal jeg nok finde det

men oplys lige om platform og compiler
Avatar billede kroxx Nybegynder
07. marts 2006 - 18:24 #2
Jeg bruger Borland C++ Builder 5.0 og det er bare windows. :)
Avatar billede arne_v Ekspert
07. marts 2006 - 19:29 #3
#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, char *fnm)
{
  FILE *fp;
  int sd,status,len,first,tmp;
  char cmd[512],resp[51200],*body;
  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\nConnection: close\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 */
  fp = fopen(fnm,"wb");
  first = 1;
  while ((len=recv(sd,resp,sizeof(resp),0))>0) {
      if(first) {
          body = strstr(resp,"\r\n\r\n") + 4;
          first = 0;
      } else {
          body = resp;
      }
      fwrite(body,len-(body-resp),1,fp);
  }
  fclose(fp);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.eksperten.dk",80,"/img/elogo.png","elogo.png");
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
07. marts 2006 - 19:34 #4
Bertel har et eksempel paa brug af WinInet, som er et lidt mere high level interface end
raa WinSock (som jeg bruger)
Avatar billede kroxx Nybegynder
07. marts 2006 - 19:49 #5
ok, tak for hjælpen, jeg fatter selvfølgelig abselut intet af det der. :)
Det er ikke muligt at forenkle det vel?
hvad jeg tænkte var noget i denne her retning:

if (http://xx.xx.xx.xx/test.gif eksisterer)
{
  gør det her
}
else
{
  gør det her
}

:)
Avatar billede arne_v Ekspert
07. marts 2006 - 19:55 #6
du kan godt lave en funktion som du kalder i din if statement

WinInet loesningen er paa faerre linier, men jeg ved ikke om den er simplere
Avatar billede bertelbrander Novice
13. marts 2006 - 14:52 #7
Det er ikke helt let at finde ud af om en fil eksisterer vha. http og WinInet.

Problemet er at man kan spørge serveren om at få filen, hvis den findes får man den, ellers kan serveren f.ex sende en http side med en besked om at filen ikke findes.

Man kan hente filen med:
http://home20.inet.tele.dk/midgaard/snip/httpget.html

Og undersøge om det man får tilbage er det man forventer. De første 3 tegn i en .gif er f.ex. "GIF"
Avatar billede arne_v Ekspert
13. marts 2006 - 15:06 #8
serveren sender vel en HTTP error status tilbage

Internet Explorer har det med at vise en fejl side i de tilfaelde

men ligger den "hjaelpsomhed" helt nede paa wininet niveauet ?
Avatar billede bertelbrander Novice
13. marts 2006 - 15:39 #9
Det kommer meget an på hvilken type fejl.
Hvis jeg beder om en fil på en server der ikke findes vil InternetOpenUrl fejle, men hvis jeg beder om en fil der ikke findes på en server der findes, vil nogle servere sende en fejlbesked i form af en http-side tilbage, det gælder f.ex. for serveren hvorpå min hjemmeside ligger. Jeg tror ikke at det er wininet der forsøger at være hjælpsom.
Avatar billede kroxx Nybegynder
13. marts 2006 - 21:02 #10
Jeg kom helt væk fra det her, men der skal selvfølgelig uddeles nogle point, så smid lige et svar så jeg kan belønne. :)

Jeg prøver lige dit script ved senere lejlighed bertelbrander, det ser lidt mere overskueligt ud. hehe
Avatar billede arne_v Ekspert
14. marts 2006 - 04:29 #11
umiddelbart vil jeg da mene at det er en grov overtrædelse af HTTP protokollen
at sende en status 200 for en side som ikke findes
Avatar billede arne_v Ekspert
14. marts 2006 - 04:29 #12
og et svar fra mig
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