Avatar billede bif_pin Nybegynder
20. september 2003 - 01:10 Der er 21 kommentarer og
2 løsninger

Kalde en asp side på webserver med en clientsocket i c++

Mit lille projekt omhandler at jeg skal via en client socket, kalde en asp side på webserveren, som så skal behandle en række medsendte parametre.

Jeg havde forestillet mig noget i denne retning(uddrag af kode):

char tekst_buffer[]="http://10.0.0.1/test.asp?para1+para2+para3";
------------------------------------------
#define KLIENT_PORT 80

Server_Adr.sin_family = AF_INET;
Server_Adr.sin_port = htons(KLIENT_PORT);
Server_Adr.sin_addr.s_addr = inet_addr("10.0.0.1");   
-----------------------------------------------------
char tekst_buffer[]="http://10.0.0.1/test.asp?para1+para2+para3";


res = send(Server_Sock, tekst_buffer, Meld_Len, 0);
------------------------------------------------------

Men den kan ikke fange det på webserveren. Er jeg helt galt på den eller hva? Det skal siges at jeg først prøvede at kalde en helt alm html fil på webserveren og det virkede heller ikke.
(char tekst_buffer[]="http://10.0.0.1/test.htm";)

Er der nogen som kan hjælpe.

Venlig hilsen TOM.
Avatar billede squashguy Nybegynder
20. september 2003 - 01:15 #1
du skal kigge lidt på http protokollen. for at hente en side skal du som minimum lave en get:

get /test.html http/1.1
Avatar billede squashguy Nybegynder
20. september 2003 - 01:17 #2
lav evt en søgning på eksperten, arne har flere gange lave nogle glimrende eksempler på dette.
Avatar billede bif_pin Nybegynder
20. september 2003 - 01:26 #3
Tak for svaret.
Jeg har prøvet at søge længe for at finde svar på mit problem, men måske søger jeg forkert.

Men mener du at jeg kan overføre "get /test.html http/1.1" ind i min send, efterfølgende af url med parametre?

Venlig hilsen TOM
Avatar billede squashguy Nybegynder
20. september 2003 - 01:34 #4
arne har lavet et godt eksempel her: http://www.eksperten.dk/spm/398007


du kan afprøve med telnet, f.eks. hvis du vil hente denne side:

telnet www.eksperten.dk 80
get /spm/403538 http/1.1
host: www.eksperten.dk
<linieskift>
<linieskift>
Avatar billede squashguy Nybegynder
20. september 2003 - 01:37 #5
kogt ned, er denne linie hvad der får serveren til at sende den ønskede side:

/* send GET request */
sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",path,hostname);
Avatar billede squashguy Nybegynder
20. september 2003 - 01:38 #6
om host parameteren er nødvendig, afhænger af hvordan serveren er sat op.
Avatar billede bif_pin Nybegynder
20. september 2003 - 01:53 #7
Mit problem er lidt kompliseret.
Den asp side som jeg skal fange på webserveren, skal ikke vises i en browser men blot lægge de medsendte parametre i min url, ned i en database på webserveren. Det er vidtigt at der ikke bliver sendt noget retur fra webserveren men jeg skal stadig være sikker på at parametrene når frem. Derfor skal jeg bruger tcp frem for udp.

Men ud fra min forklaring, skal jeg så stadig lave en GET request? eller skal det hede noget andet?

Venlig hilsen TOM
Avatar billede arne_v Ekspert
20. september 2003 - 09:39 #8
Host headeren er mandatory når man bruger HTTP 1.1 - optional når man bruger
HTTP 1.0 !

Den er nødvendig når web-serveren bruger CNAME based virtual hosrs og
ikke IP based virtual hosts (altså når der er flere navne som peger på
samme IP nummer).
Avatar billede arne_v Ekspert
20. september 2003 - 09:40 #9
Web-serveren vil altid sende et eller andet tilbage. Om ikke andet
så en OK status.
Avatar billede arne_v Ekspert
20. september 2003 - 09:43 #10
Men det du skal sende er:

char tekst_buffer[]="GET /test.htm HTTP/1.0\r\n\r\n"

char tekst_buffer[]="GET /test.asp?para1+para2+para3 HTTP/1.0\r\n\r\n";

[du har vist ikek bruge for HTTP 1.1]
Avatar billede bif_pin Nybegynder
20. september 2003 - 18:36 #11
Tak for hjælpen. Jeg tror den er lige ved at være der.

Mit probelm er at jeg nu får en fejlmeddelese retur.
-------------------------------------------------------------------------
Returnert melding er modtaget af klienten:::  HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Sat, 20 Sep 2003 16:29:08 GMT
WWW-Aut
--------------------------------------------------------------------------

Mit bud er at jeg skal afgive brugernavn og adgangskode (og måske domæne) for at få adgang til min html fil.

Men hvordan angiver jeg dette i forlængelse af GET requesten "GET /test.htm HTTP/1.0\r\n\r\n" ?

Med venlig hilsen TOM
Avatar billede arne_v Ekspert
20. september 2003 - 18:49 #12
Det er tror jeg er rigtigt.

Det kan gøres.

Men det er mange år siden jeg har lavet basic authentication manuelt.

Det skal jeg lige checke.
Avatar billede arne_v Ekspert
20. september 2003 - 19:08 #13
"GET /test.htm HTTP/1.0\r\nAuthorization: Basic XXXXXXXXXXXXXXX\r\n\r\n"

hvor XXXXXXXXXXXX er en base64 encoding af username:password !
Avatar billede arne_v Ekspert
20. september 2003 - 19:16 #14
Og svaret på næste spørgsmål (hvordan laver jeg base64 encoding):

#include <string.h>

struct sixbits { unsigned sb1:6;
                unsigned sb2:6;
                unsigned sb3:6;
                unsigned sb4:6; };

union overlay { struct sixbits sixs;
                char eigths[3]; };

char enc_b64vals[64] = { 'A','B','C','D','E','F','G','H',
                        'I','J','K','L','M','N','O','P',
                        'Q','R','S','T','U','V','W','X',
                        'Y','Z','a','b','c','d','e','f',
                        'g','h','i','j','k','l','m','n',
                        'o','p','q','r','s','t','u','v',
                        'w','x','y','z','0','1','2','3',
                        '4','5','6','7','8','9','+','/' };

void enc_normal2b64(char *s1,int l1,char *s2,int *l2)
{
  int i,j;
  union overlay Cvt;
  char *p = s1;
  int ltmp = (l1*8+5)/6;
  int extra = 3-(ltmp+3)%4;
  int linlen = 0;
  (*l2) = 0;
  // loop through string
  for(i=0;i<ltmp;i=i+4) {
      // convert 8->6 bit
      Cvt.eigths[2]=(((p-s1)<l1)?(*p):0);
      p++;
      Cvt.eigths[1]=(((p-s1)<l1)?(*p):0);
      p++;
      Cvt.eigths[0]=(((p-s1)<l1)?(*p):0);
      p++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb4];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb3];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb2];
      (*l2)++;
      s2[*l2]=enc_b64vals[Cvt.sixs.sb1];
      (*l2)++;
      // append newline if line too long
      linlen=linlen+4;
      if(linlen>75) {
        s2[*l2]='\n';
        (*l2)++;
        linlen=0;
      }
  }
  // append 0,1 or 2 "="
  (*l2)=(*l2)-extra;
  for(j=0;j<extra;j++) {
      s2[*l2]='=';
      (*l2)++;
  }
  // append newline
  s2[*l2]='\n';
  (*l2)++;
  return;
}

int main()
{
  int l2;
  char s1[100],s2[100];
  strcpy(s1,"mig:hemmeligt");
  enc_normal2b64(s1,strlen(s1),s2,&l2);
  s2[l2]='\0';
  printf("%s -> %s\n",s1,s2);
  return 0;
}
Avatar billede arne_v Ekspert
20. september 2003 - 19:17 #15
Så med brugernavn "mig" og password "hemmeligt":

"GET /test.htm HTTP/1.0\r\nAuthorization: Basic bWlnOmhlbW1lbGlndA==\r\n\r\n"
Avatar billede arne_v Ekspert
20. september 2003 - 19:17 #16
Og nu vil jeg tillade mig at ligge et svar.
Avatar billede bif_pin Nybegynder
20. september 2003 - 23:28 #17
Du er virkelig fantastisk arne.

Jeg compilerede din kode (manglede lige en #Include<stdio.h>) og fik konverteredet mit brugernavn til Base64 kode og fik skrevet den ind i bufferen.

Men desværre virker det stadig ikke. Jeg får samme fejlmeddelelse som før(access denied).
Er det måske fordi jeg kun kører med brugernavn og ikke adgangskode?

Jeg har prøvet at angive :administrator og :admin efter mit brugernavn(i base 64 form selfølgelig) men den nægter mig stadig adgang.

Når jeg skriver stien til html filen i browseren skal jeg kun angive mit brugernavn i adgangskodeboksen.

Jeg tvivler ikke på det du skriver, men er GET requesten srevet rigtig med \r\n osv?
Ved du hvor jeg kan læse og lære noget om det?

Det er sgu ærgeligt når man sidder tilsidst og mangler sådan en iriterende fejl. Men har du set i fejlmeddelelsen at den udover skriver adgang nægtet, så skriver den en 401 fejl kode. Betyder det ikke at siden ikke findes?

sikke mange spørgsmål men jeg er blevet lidt deperat.

Med venlig hilsen TOM
Avatar billede arne_v Ekspert
20. september 2003 - 23:38 #18
Kun brugernavn ?

Har du prøvet med både
  brugernavn
og
  brugernavn:
?

Kunne du prøve at læse lidt mere så vi kan få resten af
svaret fra IIS (i forhold til 20/09-2003 18:36:22) ?
Avatar billede bif_pin Nybegynder
20. september 2003 - 23:54 #19
Jeg prøvede lige med brugernavn_brugernavn men det gik heller ikke.

her er udskrift al udsrift i dos promten.
------------
WSAStartup er OK

Returnert melding er modtaget af klienten:::  HTTP/1.1 401 Access Denied
Server: Microsoft-IIS/5.0
Date: Sat, 20 Sep 2003 21:49:56 GMT
WWW-Aut

Returnert melding er modtaget af klienten:::  henticate: Negotiate
WWW-Authenticate: NTLM
Content-Length: 3236
Content-Type: text/html

<!DO
Feilkode i send():10053
--------------------------

Håber det kan give mere info.

Venlig hilsen TOM
Avatar billede arne_v Ekspert
21. september 2003 - 00:47 #20
Så er det ikke basic authentication men NT authentication.

:-(

Har du mulighed for at få det lavet om til basic authentication ?
Avatar billede arne_v Ekspert
21. september 2003 - 00:55 #21
Der står lidt om NTLM her:
  http://dbforums.com/t555377.html

Ser ikke spor morsomt ud !
Avatar billede arne_v Ekspert
21. september 2003 - 00:57 #22
Avatar billede bif_pin Nybegynder
22. september 2003 - 16:13 #23
Du skal have rigtig mange tak for din store hjælp Arne. Det er godt at have dig herinde til lige at undgå nervesammenbrud hos forvirede mennesker som mig :-). Jeg vil tillade mig at give dig næsten alle points pga dit store arrengement.
squashguy vil dog også lige få en lille sjat for hans bidrag.

Venlig hilsen TOM
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