Avatar billede huusom Nybegynder
07. september 2003 - 19:51 Der er 32 kommentarer og
1 løsning

Hente Lotto tal fra Hjemmeside

Jeg er igang med at lave et Program der henter lotto tallene og tjecker om der er gevinst.

Men hvordan får jeg C++ til at kigge ude på Dansk tipstjeneste?

Jeg er nybegynder... så go easy on me. :0)
Avatar billede arne_v Ekspert
07. september 2003 - 19:57 #1
Du finder den URL der har tallene (husk at det skal være selve framen
med tallene), så åbner du en socket til port 80 på www.tips.dk og requester
den side, så parser du responsen.

Det kræver lidt kode at lave !
Avatar billede huusom Nybegynder
07. september 2003 - 20:06 #2
Øhhh..... shit....
Kunne jeg få lidt kode hjælp... jeg mener... jeg er RIGTIG nybegynder.
Jeg har kun lært at kode i C++ i dos... jeg er først begyndt at lugte til MFC programmering nu.
Avatar billede arne_v Ekspert
07. september 2003 - 20:14 #3
Jeg prøver lige at bikse noget kode.
Avatar billede arne_v Ekspert
07. september 2003 - 20:27 #4
Kode:

#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],*p1,*p2,seg[1024];
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  time_t t;
  /* 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 POST 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,"TR&AElig;KNING");
  p2=strstr(p1,"P R &AElig; M I E R");
  strncpy(seg,p1,p2-p1);
  seg[p2-p1]='\0';
  printf("%s\n",seg);
fin:
  close(sd);
  return;
}

int main(int argc,char *argv[])
{
  get("www.dr.dk",80,"/cgi-bin/fttx1.exe/291");
  return 0;
}
Avatar billede arne_v Ekspert
07. september 2003 - 20:28 #5
Output:

TR&AElig;KNING  06. SEPTEMBER 2003 
                                       
              VINDERTAL:             

    01 - 05 - 11 - 27 - 33 - 35 - 36   

                                       
    TILL&AElig;GSTAL:            JOKERTAL:   

    13 - 25            6-9-7-1-5-1-7
Avatar billede arne_v Ekspert
07. september 2003 - 20:29 #6
Jeg valgte at hapse tallene fra www.dr.dk i.s.f. www.tips.dk fordi
HTML'en var nemmere at parse.

Koden er Unix/Linux kode - skal tilrettes en lille smule for Windows.

Den printer bare et segment. Du skal naturligvis have parset
tallene ud.

Men nu kan du ihvertfald se hvad det er jeg snakker om.
Avatar billede huusom Nybegynder
07. september 2003 - 20:34 #7
Øhm... ja...
Du får sgu pointene.
Jeg ved sgu ikke engang hvordan jeg skal starte.
Det er sgu nemmere at kode i gode gamle dos end det her her Visual C++.
Der er sgu så meget man ikke ved hvad man skal bruge til...
Al den kode du skrev kan jeg godt genkende og forstå... men hvordan får man det oversat til MFC kode?
Avatar billede the_legend Nybegynder
07. september 2003 - 20:36 #8
muligt jeg kan få en kopi af exe filen?
Avatar billede arne_v Ekspert
07. september 2003 - 20:37 #9
Ja.

Men vil du ikke have den til Windows ?

(så skal jeg lige have den til at compile på Windows)
Avatar billede arne_v Ekspert
07. september 2003 - 20:41 #10
Her er sourcen til en version der compiler med MS VC++ 6:

#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],*p1,*p2,seg[1024];
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  time_t t;
  /* 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 POST 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,"TR&AElig;KNING");
  p2=strstr(p1,"P R &AElig; M I E R");
  strncpy(seg,p1,p2-p1);
  seg[p2-p1]='\0';
  printf("%s\n",seg);
fin:
  close(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.dr.dk",80,"/cgi-bin/fttx1.exe/291");
  WSACleanup();
  return 0;
}

command line build:

cl lotto.c /link wsock32.lib
Avatar billede arne_v Ekspert
07. september 2003 - 20:42 #11
Jeg smider begge source plus en Windows EXE op på min web server om
lidt.
Avatar billede arne_v Ekspert
07. september 2003 - 20:43 #12
Med hensyn til konvertering til MFC.

Så burde det ikke være så svært.

Det meste af koden kan faktisk genbruges. Console output skal naturligvis
erstattes af noget andet.
Avatar billede huusom Nybegynder
07. september 2003 - 20:44 #13
Har i nogle gode link til hvor man kan lære at kode i Visual C++?
Eller nogle forslag til hvordan man kan lære det?

Jeg synes jeg læser og læser og alle de der tutorials... ja eksemplerne virker da, men når jeg så selv skal prøve kan jeg ikke finde ud af en skid.
Avatar billede arne_v Ekspert
07. september 2003 - 20:45 #14
Og et par bemærkninger om koden:

1)  den kunne sikkert godt forbedres lidt men jeg copy pastede lige
    lidt fra noget gammelt kode

2)  på Windows er der også er high level interface til HTTP, men
    jeg valgte altså at genbruge socket koden
Avatar billede huusom Nybegynder
07. september 2003 - 20:46 #15
Jeg kopierede den lige ind og compilede den... så kom den og sagde:
Cpp1.cpp
C:\vcpp32\Cpp1.cpp(67) : error C2065: 'close' : undeclared identifier
Error executing cl.exe.
Jeg ved ikke engang hvad jeg skal gøre ved dette.
Avatar billede arne_v Ekspert
07. september 2003 - 20:48 #16
Bruger du version 7 ?

Formentlig skal du bare tilføje en:

#include <io.h>
Avatar billede huusom Nybegynder
07. september 2003 - 20:49 #17
Jeg bruger Version 6.0 Jeg vidste ikke engang der var en 7'er.
Det prøver jeg lige
Avatar billede arne_v Ekspert
07. september 2003 - 20:50 #18
C++:

http://www.cplusplus.com/doc/tutorial/
http://www.cppreference.com/

Win32 API:

http://www.winprog.org/tutorial/

men C++ er et stort og komplekst sprog - og Win32 er en kompleks
platform.

Du bliver formentlig nødt til at få fat i en eller flere gode bøger.
Avatar billede huusom Nybegynder
07. september 2003 - 20:51 #19
Det nidoblede lige fejlene... ved at jeg skrev #include <io.h> og jeg gjorde det under de andre Includere.
Avatar billede arne_v Ekspert
07. september 2003 - 20:51 #20
Mystisk.

Jeg bruger nemlig ogsp version 6.

Er du på SP5 ?
Avatar billede arne_v Ekspert
07. september 2003 - 20:52 #21
Hvis ikke og du har ADSL så hent SP5 og installer.
Avatar billede no_doubt Nybegynder
07. september 2003 - 20:52 #22
Er der nogen der bare har et program som ved at starte programmet bare skriver tallerne på en form

Undskyld jeg blander mig ?
Avatar billede squashguy Nybegynder
07. september 2003 - 20:56 #23
hedder den ikke closesocket() under windows?
Avatar billede huusom Nybegynder
07. september 2003 - 20:57 #24
Er det nemmere at bruge Visual Studio .NET end det er at bruge Visual C++ ???
Avatar billede arne_v Ekspert
07. september 2003 - 20:58 #25
Det tror jeg er rigtigt.

Det virkede for mig med close og MS VC++ 6.0SP5 men med BCB 5.5 fik
jeg også fejl.

Og den forsvandt med closesocket.

[hvor f..... kan MS ikke vælge at gøre tingene standard]
Avatar billede arne_v Ekspert
07. september 2003 - 21:00 #26
Visual Studio .NET er en nyere version af Visual Studio som understøtter
.NET - for dette problem tror jeg ikke at der er den store forskel, men
generelt er det jo altid godt med nyeste.
Avatar billede arne_v Ekspert
07. september 2003 - 21:06 #27
Avatar billede arne_v Ekspert
07. september 2003 - 21:07 #28
no_doubt>

Muligvis er du interesseret i den samme EXE som the_legend.

Se link ovenfor.
Avatar billede the_legend Nybegynder
08. september 2003 - 15:59 #29
arne den lukker lige med det samme!
Avatar billede no_doubt Nybegynder
08. september 2003 - 16:03 #30
Hvaaa kan du ikke lave det til et "program"
Avatar billede arne_v Ekspert
08. september 2003 - 17:36 #31
the_legend>

Kører du programmet i en DOS box ? (det skal du)
Avatar billede arne_v Ekspert
08. september 2003 - 17:37 #32
no_doubt>

Det er et program.

Vil du have det med vindue ?
Avatar billede no_doubt Nybegynder
08. september 2003 - 23:49 #33
vindue ?
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis