Avatar billede bentbit Nybegynder
09. januar 2006 - 13:58 Der er 12 kommentarer

Download fil fra internettet

Hej Eksperten

Jeg mangler en applikation der kan donwloade en fil, for eksempel et jpg billede fra en hjemmeside.
Programmet skulle kunne bruges lige meget hvilken Internet browser man bruger.
Har nogle prøvet at bruge ClientSocket til at hente en fil fra Internettet, hvis ja hvordan ?
Andre forslag er også velkommen, gerne kildekode eksempel.

Hilsen
Bentbit
Avatar billede bentbit Nybegynder
09. januar 2006 - 14:00 #1
Jeg bruger forresten Borland CBuilder 6

Hilsen
Bentbit
Avatar billede arne_v Ekspert
09. januar 2006 - 14:01 #2
jeg har postet den her kode nogle gange

get metoden bør kunne bruges i enhver Win32 compiler

#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 bentbit Nybegynder
09. januar 2006 - 15:53 #3
Hej Arne

Kan det passe, dit eksempel mangler #include <WINSOCK.H> ?

Hilsen
Nils
Avatar billede arne_v Ekspert
09. januar 2006 - 15:56 #4
nej

den bliver inkluderet af windows.h
Avatar billede bentbit Nybegynder
09. januar 2006 - 16:12 #5
Hmm, får en del compiler fejl i CBuilder, bland andet disse :
[C++ Error] Unit1.cpp(28): E2450 Undefined structure 'sockaddr'
[C++ Error] Unit1.cpp(28): E2449 Size of 'remote' is unknown or zero
[C++ Error] Unit1.cpp(37): E2315 'sa_family' is not a member of 'sockaddr', because the type is not yet defined
[C++ Error] Unit1.cpp(51): E2315 'sa_family' is not a member of 'sockaddr', because the type is not yet defined

/Nils
Avatar billede arne_v Ekspert
09. januar 2006 - 16:20 #6
inkluderer du windows.h ?
Avatar billede bertelbrander Novice
09. januar 2006 - 23:23 #7
En anden kode til at hente et .jpg billede fra en internet side og gemme det i en fil.

#include <windows.h>
#include <wininet.h>
#include <iostream>
#include <stdio.h>

char Buffer[16*1024*1024];

int main()
{
  HINTERNET Internet = InternetOpen("My Url Browser", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0);
  if(!Internet)
  {
      std::cout << "Failed to open internet: " << GetLastError() << std::endl;
      return 1;
  }

  HINTERNET Url = InternetOpenUrl(Internet, "http://fjolletobak.com/downloadsnew/sub_14641.jpg", 0, 0, INTERNET_FLAG_RAW_DATA, 0);
  if(!Url)
  {
      std::cout << "Failed to open Url: " << GetLastError() << std::endl;
      return 2;
  }

  DWORD ReadLen = 0, CurrentPos = 0;
  do
  {
      InternetReadFile(Url, (void *)(Buffer + CurrentPos), sizeof(Buffer) - CurrentPos, &ReadLen);
      CurrentPos += ReadLen;
  }
  while(ReadLen);


  FILE *f = fopen("test.jpg", "wb");
  fwrite(Buffer, CurrentPos, 1, f);
  fclose(f);
  InternetCloseHandle(Url);
  InternetCloseHandle(Internet);
}
Avatar billede arne_v Ekspert
12. marts 2006 - 05:46 #8
status ?
Avatar billede bentbit Nybegynder
22. juni 2006 - 14:07 #9
Hej Arne

Problemet blev løst af anden vej, men du skal selvfølgelig have dine point.
Men hvordan er det nu lige man gør edette ? - Er ikke ret stiv i den her portal :-)

Hilsen
Nils
Avatar billede arne_v Ekspert
22. juni 2006 - 15:00 #10
jeg ligger et svar som du kan acceptere
Avatar billede bentbit Nybegynder
24. juni 2006 - 22:37 #11
Hej Arne

Tror tråden slutter her, hvis du har fået dine point ?

Hilsen
Nils
Avatar billede arne_v Ekspert
25. juni 2006 - 01:18 #12
du skal markere mit navn ude i combo boxen så det bliver blåt inden du klikker accepter
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