Avatar billede caturn Nybegynder
10. april 2004 - 10:21 Der er 10 kommentarer og
1 løsning

Http library

Hej!

Er der nogen der kender et library til http?
Det skal både være til linux og windows.

Venlig hilsen
Christian
Avatar billede arne_v Ekspert
10. april 2004 - 10:24 #1
Hvilke features har du brug for ?

Simple FET og POST requests er nemme at lave med standard sockets (jeg har
postet kode til det mange gange).
Avatar billede caturn Nybegynder
10. april 2004 - 10:50 #2
Jeg skal bare kunne læse og skrive fra/til txt filer på min egen server.
Avatar billede arne_v Ekspert
10. april 2004 - 11:18 #3
Du kan hente med en GET - men hvordan vil du skrive ? POST til en ASP/PHP side
som opdaterer filen ?
Avatar billede caturn Nybegynder
10. april 2004 - 11:24 #4
Ja det må blive med PHP da det er det jeg kan.
Men kan jeg få lidt hjælp til selve C++ koden?
Avatar billede arne_v Ekspert
10. april 2004 - 11:28 #5
GET / Linux:

#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 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;
      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 arne_v Ekspert
10. april 2004 - 11:28 #6
GET / Windows:

#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,tmp;
  char cmd[512],resp[51200],*p,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 */
  fp = fopen(fnm,"wb");
  len=recv(sd,resp,sizeof(resp),0);
  p = strstr(resp,"\r\n\r\n") + 4;
  fwrite(p,1,len-(p-resp),fp);
  while ((len=recv(sd,resp,sizeof(resp),0))>0) {
      fwrite(resp,1,len,fp);
  }
  fclose(fp);
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.domain.dk",80,"/dir/billede.jpg","billede.jpg");
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
10. april 2004 - 11:29 #7
Linux eksemplet er en tekst fil. Windows eksempelt er en binær fil.
Avatar billede arne_v Ekspert
10. april 2004 - 11:31 #8
POST:

sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n%s\r\n",path,hostname,"field1=value1&field2=value");
Avatar billede arne_v Ekspert
10. april 2004 - 11:32 #9
Alle eksemplerne er simple console app, men selve socket koden kan bruges i enhver
kontekst.
Avatar billede caturn Nybegynder
10. april 2004 - 13:22 #10
Tak!

Jeg kigger på det lidt senere men du kan bare lægge et svar.
Avatar billede arne_v Ekspert
10. april 2004 - 13:41 #11
svar
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