Avatar billede mortenah Nybegynder
31. august 2004 - 19:41 Der er 17 kommentarer og
1 løsning

c++ og cgi

Hej

Jeg har brug for at sende (med POST) data fra mit c++ (mfc) program til en cgi-side på en web-server(http med SSL), og modtage svar tilbage. Jeg ved hvilke parametre osv jeg skal sende, jeg ved bare ikke hvordan man kommunikerer med en webserver fra en applikation.

Nogen der kan hjælpe?
Avatar billede arne_v Ekspert
31. august 2004 - 19:50 #1
Eksempel:

#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 *args)
{
  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 POST request */
  sprintf(cmd,"POST %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\nContent-Length: %d\r\n\r\n%s\r\n",
          path,hostname,strlen(args),args);
  status=send(sd,cmd,strlen(cmd),0);
  if(status<0) {
      printf("Error sending POST request\n");
      goto fin;
  }
  /* read response */
  while ((len=recv(sd,resp,sizeof(resp),0))>0) {
      printf("%s",resp);
  }
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.xxxx.dk",80,"/cgi-bin/script","f1=val1&f2=val2");
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
31. august 2004 - 19:51 #2
Ovenstående laver en post med 2 felter med navne f1 og f2 og værdier
val1 og val2.

Det er en console app, men det kan du nemt lave om.
Avatar billede arne_v Ekspert
31. august 2004 - 19:51 #3
OK ?
Avatar billede mortenah Nybegynder
31. august 2004 - 19:57 #4
Vil det også fungere med en SSL side?
Avatar billede arne_v Ekspert
31. august 2004 - 19:59 #5
Nej. Ikke as is. Sorry.

Hvilket SSL library har du ?
Avatar billede mortenah Nybegynder
31. august 2004 - 20:07 #6
Jeg ved ikke om jeg overhovedet har et? :o) Internet-kommunikation ved jeg simpelthen for lidt om.

Normalt kalder man vist de cgi-sider jeg her skal bruge fra ande websider (de anvendes til at gennemføre dankort-betalinger online), men jeg skal gerne kunne gøre dette fra en stand-alone applikation.

Den dokumentation jeg har på det beskriver kun de url jeg skal kalde og parameter-felter jeg skal overføre. Jeg kan evt sende det...
Avatar billede arne_v Ekspert
31. august 2004 - 20:10 #7
Det er ikke vigtigt.

Men du skal have et SSL library.

Er det et must at det skal være MS VC++ 6 eller unmanaged MS VC++ 7/7.1
eller er managed MS VC++ 7/7.1 en mulighed ?

(læs: hvilken compiler version bruger du ?)
Avatar billede mortenah Nybegynder
31. august 2004 - 20:18 #8
Vi får VC++ 7, men dette her skal desværre gerne være implementeret før da.... så svaret er VC++ 6.

Men hvis det er meget besværligt/umuligt må det jo vente.

Leverandøren kan levere et COM-objekt til formålet, men det er meget dyrt pr. bruger, så det kunne være rart at undgå.
Avatar billede arne_v Ekspert
31. august 2004 - 20:22 #9
OpenSSL er gratis !
Avatar billede arne_v Ekspert
31. august 2004 - 20:23 #10
Men så skal jeg vist lige til at læs elidt hvordan man erstatter en normal
socket med en SSL socket.
Avatar billede mortenah Nybegynder
31. august 2004 - 20:24 #11
Det lyder som en sag der kræver mere end 60 point :)
Avatar billede arne_v Ekspert
31. august 2004 - 20:30 #12
Jeg er mere bekymret for hvor svært det er ... - point kommer først ind i billedet
bagefter
Avatar billede mortenah Nybegynder
31. august 2004 - 20:34 #13
Helt i orden. Jeg ser jo hvis du finder på noget, og tak for hjælpen so far ihvertfald.
Avatar billede mortenah Nybegynder
31. august 2004 - 20:41 #14
Jeg har fundet noget på codeproject, har dog ikke haft mulighed for at prøve det endnu. Der står det understøtter HTTPS:

http://www.codeproject.com/internet/w3client.asp
Avatar billede arne_v Ekspert
31. august 2004 - 20:50 #15
Det ser da faktisk meget lovende ud.

wininet betyder at den bruger samme komponent som Internet Explorer.
Avatar billede mortenah Nybegynder
31. august 2004 - 22:56 #16
Det ser faktisk ud til at virke, jeg får ihvertfald den rigtig respons tilbage på det jeg poster til siden.... :o)
Avatar billede arne_v Ekspert
01. september 2004 - 09:34 #17
Ellers havde jeg fundet nogle links til OpenSSL
Avatar billede mortenah Nybegynder
01. september 2004 - 22:23 #18
Du får point som tak for indsatsen...
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