Avatar billede spiritusanta Nybegynder
22. februar 2006 - 22:24 Der er 13 kommentarer og
1 løsning

Åbning af hyperlink?

Hey
Nogen der ved hvordan man henter/gemmer eksempelvis et billede fra internettet igennem c++?

mvh
Jonas
Avatar billede arne_v Ekspert
22. februar 2006 - 22:28 #1
en mulighed er det gode gamle socket interface

jeg har foer lavet eksempler til dette

windows eller linux ?
Avatar billede spiritusanta Nybegynder
22. februar 2006 - 22:40 #2
windows
Avatar billede arne_v Ekspert
22. februar 2006 - 22:45 #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,ho
stname);
  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 bertelbrander Novice
22. februar 2006 - 23:48 #4
En anden model:

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

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;
  }

  char* Buffer = new char [16*1024*1024];

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

  std::ofstream File("test.jpg", std::ios::binary);
  File.write(Buffer, CurrentPos);
  delete [] Buffer;

  InternetCloseHandle(Url);
  InternetCloseHandle(Internet);
}
Avatar billede spiritusanta Nybegynder
23. februar 2006 - 11:02 #5
Jeg prøver lige først arne_v's ,metode, men der opstår fejl her:

status=connect(sd,&remote,sizeof(remote));
if(status!=0) {
    printf("Error connecting to host: %s port: %d\n",hostname,port);
    goto fin;
}
Avatar billede spiritusanta Nybegynder
23. februar 2006 - 11:13 #6
Så har jeg også prøvet bertelbrander, den virker heller ikke :(, kommer en masse link errors, er der nogen bestemte lib der skal tilføjes?

og til dig arne_v
så har jeg tilføjet følgende:
#include <winsock2.h>
og
wsock32.lib

virker lidt, men stadig fejl i ovennævnte funktion :(
Avatar billede arne_v Ekspert
23. februar 2006 - 14:55 #7
windows.h boer inkludere det noedvendige

ws2_32.lib er den jeg plejer at linke med

hvilken fejl ??
Avatar billede spiritusanta Nybegynder
23. februar 2006 - 19:24 #8
Jeg har sat en del kommentare ind i koden for at se hvor fejlen opstår og jeg har fundet ud af at den først hænger lidt og senere melder fejl her:

status=connect(sd,&remote,sizeof(remote));
if(status!=0) {
    printf("Error connecting to host: %s port: %d\n",hostname,port);
    goto fin;
}
Avatar billede spiritusanta Nybegynder
23. februar 2006 - 19:31 #9
nå programmet virker nu hvor jeg er kommet hjem.. det er nok pga skolens firewall, der blokker mig af.. men mange tak for hjælpen :)
Avatar billede spiritusanta Nybegynder
23. februar 2006 - 19:32 #10
Så er der noget at bygge op fra.. smider du et svar :)
Avatar billede arne_v Ekspert
23. februar 2006 - 19:39 #11
hvis du skal ud igennem en proxy server (fordi det kun er den
som kan komme igennem firewall) saa connecter du til firewallen
og sender fuld URL hvor du nu sender path
Avatar billede arne_v Ekspert
23. februar 2006 - 19:40 #12
og et svar
Avatar billede bertelbrander Novice
23. februar 2006 - 22:39 #13
For at bruge min kode skal du linke med wininet (wininet.lib eller libwininet.a)
Avatar billede spiritusanta Nybegynder
18. marts 2006 - 16:39 #14
Mange tak for hjælpen :)
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