Avatar billede thomas_nj Nybegynder
27. november 2003 - 12:48 Der er 30 kommentarer og
1 løsning

Ugnes tilbud direkte til mit program

Hej

  Jeg er i gang med et projekt om mad på SU og her synes jeg at det vil være en god ide at lave et program der kan hjælpe studerende med at organisere deres indkøb.

  En fed ting vil dog være hvis jeg på en eller anden måde kan få mit program til at vise ugens tilbud fra en eller flere dagligvareforretninger.

  Er der en der har et forslag til hvordan jeg kan gøre dette?
Avatar billede arne_v Ekspert
27. november 2003 - 12:51 #1
Du tænker på at hente informationer fra butikkernes web-sider ?
Avatar billede thomas_nj Nybegynder
27. november 2003 - 12:52 #2
Ja noget i den retning. Det vil være en fed feature men jeg har en teori om at det bliver svært
Avatar billede arne_v Ekspert
27. november 2003 - 12:55 #3
Det er ikke så svært at hente en web side med socket. Det er også muligt at
parse siden, men problemet er når de hyppigt ændrer layout.
Avatar billede arne_v Ekspert
27. november 2003 - 12:56 #4
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,"/");
}
Avatar billede thomas_nj Nybegynder
27. november 2003 - 12:59 #5
Jeg har ikke lige en compiler til rådighed. Hvad gør ovenstående kode helt præcis
Avatar billede thomas_nj Nybegynder
27. november 2003 - 12:59 #6
lige nu. Har det når jeg kommer hjem :)
Avatar billede arne_v Ekspert
27. november 2003 - 13:00 #7
Henter en web side og printer den.

Det sidste er linien:
  printf("%s",resp);
ogden kan jo erstattes af noget kod eder processer infholdet.
Avatar billede arne_v Ekspert
27. november 2003 - 22:21 #8
Kan det bruges ?
Avatar billede thomas_nj Nybegynder
27. november 2003 - 22:23 #9
Har ikke disse filer:

#include <sys/socket.h>
#include <fcntl.h>
#include <netdb.h>
#include <errno.h>
Avatar billede arne_v Ekspert
27. november 2003 - 22:25 #10
Windows ?
Avatar billede arne_v Ekspert
27. november 2003 - 22:26 #11
På windows skal du include:

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

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

og bruge closesocket i.s.f. close til sidst.
Avatar billede thomas_nj Nybegynder
30. november 2003 - 21:07 #12
Har været væk i weekenden men får stadig en compilerfejl.
Min kode er nu:

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

int main(int argc,char *argv[])
{
  get("www.xxxx.dk",80,"/");
}
Avatar billede arne_v Ekspert
30. november 2003 - 21:12 #13
Hvilken compiler fejl ?
Avatar billede arne_v Ekspert
30. november 2003 - 21:12 #14
Og hvilken compiler ?
Avatar billede thomas_nj Nybegynder
30. november 2003 - 21:42 #15
Bruger dev-cpp

Fejlene er egentlig ik compile men linkeren. de ser sådanher ud:


Compiler: Default compiler
Executing  g++.exe...
g++.exe "D:\Gumbert\TRY\C++\Try.cpp" -o "D:\Gumbert\TRY\C++\Try.exe"    -I"E:\Tools\Dev-Cpp\include\c++"  -I"E:\Tools\Dev-Cpp\include\c++\mingw32"  -I"E:\Tools\Dev-Cpp\include\c++\backward"  -I"E:\Tools\Dev-Cpp\include"  -L"E:\Tools\Dev-Cpp\lib"
C:\DOCUME~1\Gumbert1\LOCALS~1\Temp/cc4qaaaa.o(.text+0xdf):Try.cpp: undefined reference to `socket@12'
C:\DOCUME~1\Gumbert1\LOCALS~1\Temp/cc4qaaaa.o(.text+0x14f):Try.cpp: undefined reference to `bind@12'
C:\DOCUME~1\Gumbert1\LOCALS~1\Temp/cc4qaaaa.o(.text+0x194):Try.cpp: undefined reference to `gethostbyname@4'
C:\DOCUME~1\Gumbert1\LOCALS~1\Temp/cc4qaaaa.o(.text+0x237):Try.cpp: undefined reference to `connect@12'
C:\DOCUME~1\Gumbert1\LOCALS~1\Temp/cc4qaaaa.o(.text+0x29c):Try.cpp: undefined reference to `send@16'
C:\DOCUME~1\Gumbert1\LOCALS~1\Temp/cc4qaaaa.o(.text+0x2db):Try.cpp: undefined reference to `recv@16'

C:\DOCUME~1\Gumbert1\LOCALS~1\Temp/cc4qaaaa.o(.text+0x330):Try.cpp: undefined reference to `closesocket@4'

Execution terminated
Avatar billede arne_v Ekspert
30. november 2003 - 21:46 #16
Nå.

Du skal linke mod winwock library.

project options
link options
og enten -lwock32 eller -lws2_32
Avatar billede thomas_nj Nybegynder
30. november 2003 - 22:07 #17
De giver begge en fejl. De skal sættes ind som parametre til linkeren ikke også (kan ikke helt finde den der hedder link options)
Avatar billede arne_v Ekspert
30. november 2003 - 22:09 #18
Når jeg i dev-cpp angiver link options:
  -lwsock32
så linker den fint.
Avatar billede thomas_nj Nybegynder
30. november 2003 - 22:11 #19
Under projekt options vælger du der parameter og så linker?? Jeh kan nemlig ikke finde link options
Avatar billede arne_v Ekspert
30. november 2003 - 22:13 #20
I 4.96 hedder det:

project
project options
linker options/Additional librarie sor object files
Avatar billede arne_v Ekspert
30. november 2003 - 22:14 #21
project
project options
general tab
linker options/Additional librarie sor object files
Avatar billede thomas_nj Nybegynder
30. november 2003 - 22:17 #22
Kan slet ikke finde den. bruger 4.9.8.0
Avatar billede arne_v Ekspert
30. november 2003 - 22:19 #23
OK

Parametre til linkeren lyder også rigtigt.

-lwsock32

eller

-lws2_32

?
Avatar billede thomas_nj Nybegynder
30. november 2003 - 22:26 #24
Ok nu compiler programmet men den viser:

Error creating socket: No error

Har du et eksempel på et funtionskald der virker. Har prøvet med

get("http://www.optur.dk/",80,"/");
Avatar billede thomas_nj Nybegynder
30. november 2003 - 22:28 #25
get("www.eksperten.dk",80,"/spm/433080"); hvis jeg vil se dette spørgsmål. Er jeg galt i byen med portnummeret
Avatar billede arne_v Ekspert
30. november 2003 - 22:29 #26
Prøv lige med:

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("http://www.optur.dk/",80,"/");
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
30. november 2003 - 22:29 #27
Port nummeret er OK.

Jeg har bare for 1 millionte gang glemt de WSA kald man skal bruge på Windows.
Avatar billede thomas_nj Nybegynder
30. november 2003 - 22:33 #28
Nu får jeg: Error looking up host:

Har også prøvet med et par andre sited. Andet du tror du har glemt :) ??
Avatar billede arne_v Ekspert
30. november 2003 - 22:36 #29
Man ved aldrig !

Men prøv og kald som:

get("www.optur.dk",80,"/");
Avatar billede thomas_nj Nybegynder
30. november 2003 - 22:40 #30
Mange tak arne det virker perfekt. Synes bare kaldet virker underligt men.....
Avatar billede arne_v Ekspert
30. november 2003 - 22:43 #31
http://www.optur.dk:80/

dekomponeres i:

protokol = HTTP (implicit)
host = www.optur.dk (1. argument)
port = 80 (2. argument
path = / (3. argument)
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