Avatar billede medions Nybegynder
09. juli 2004 - 20:33 Der er 10 kommentarer og
1 løsning

Hvordan sender et HTTP kald (Win32 API)

Jeg skal have en lille tilbygning til mig program sådan at jeg kan se hvor meget hver enkelt bruger, bruger programmet.

Derfor vil jeg sende et HTTP kald til www.domain.com/counter.php?id=1 hvor ID'et så vil blive registreret.

Men hvordan sender jeg kaldet?

-Det skal være til Win32 API det skal kodes.

//>Rune
Avatar billede arne_v Ekspert
09. juli 2004 - 20:34 #1
To muligheder:

1)  wininet

2)  winsock

Jeg kan levere kode til #2.
Avatar billede arne_v Ekspert
09. juli 2004 - 20:35 #2
#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 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 GET 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';
  printf("%s",resp);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.eksperten.dk",80,"/");
  WSACleanup();
  return 0;
}
Avatar billede medions Nybegynder
09. juli 2004 - 20:45 #3
Hmm, kan det ikke gøres mere simpelt? :)

Når jeg tester koden får jeg flg. fejl:

main.obj : error LNK2001: unresolved external symbol _WSACleanup@0
main.obj : error LNK2001: unresolved external symbol _WSAStartup@8
main.obj : error LNK2001: unresolved external symbol _closesocket@4
main.obj : error LNK2001: unresolved external symbol _recv@16
main.obj : error LNK2001: unresolved external symbol _send@16
main.obj : error LNK2001: unresolved external symbol _connect@12
main.obj : error LNK2001: unresolved external symbol _gethostbyname@4
main.obj : error LNK2001: unresolved external symbol _bind@12
main.obj : error LNK2001: unresolved external symbol _socket@12
Debug/Tray_VC.exe : fatal error LNK1120: 9 unresolved externals

//>Rune
Avatar billede arne_v Ekspert
09. juli 2004 - 20:48 #4
Du skal linke med wsock32.lib eller ws2_32.lib
Avatar billede arne_v Ekspert
09. juli 2004 - 20:49 #5
Du kan muligvis kompakte koden lidt.

Men socket kode tager lidt linier.

Eller så kan du kigge på #1 wininet funktionerne.

De skulel være mere high level.
Avatar billede medions Nybegynder
09. juli 2004 - 21:03 #6
Hej Arne.

Nu har jeg prøvet at gøre sådan her:

        case WM_LBUTTONDOWN:{         
          WSADATA WSAData;
          WSAStartup(0x0101,&WSAData);
          get("mydomain.dk/test.php?id=1",80,"/");
          WSACleanup();

Men der sker ikke noget :-(

//>Rune
Avatar billede arne_v Ekspert
09. juli 2004 - 21:05 #7
Prøv:

get("mydomain.dk",80,"/test.php?id=1");
Avatar billede arne_v Ekspert
09. juli 2004 - 21:06 #8
void get(char *hostname,int port,char *path)
Avatar billede medions Nybegynder
09. juli 2004 - 21:10 #9
Nu fryser mit program :(

//>Rune
Avatar billede medions Nybegynder
09. juli 2004 - 22:55 #10
Smid et svar, nu virkede det! -det var blot mig der havde placeret koden forkert!

1000 tak for hjælpen!

//>Rune
Avatar billede arne_v Ekspert
09. juli 2004 - 22:56 #11
ok
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