Gå til innhold

Greier ikke å POST'e data med c++ sockets


Anbefalte innlegg

#include <stdio.h>
#include "winsock2.h"
#include <iostream>
#include <fstream>
#include <windows.h>


using namespace std;
int main(int argc, char *argv[]) {
   
   // MessageBox(NULL, "hallo", "socketIndication", MB_OK);
   
   // Initialize Winsock.
   WSADATA wsaData;
   int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
   if ( iResult != NO_ERROR )
       printf("Error at WSAStartup()\n");

   // Create a socket.
   SOCKET m_socket;
   m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

   if ( m_socket == INVALID_SOCKET ) {
       printf( "Error at socket(): %ld\n", WSAGetLastError() );
       WSACleanup();
       return 1;
   }

   // Connect to a server.
   
   
   LPHOSTENT hostEntry;
   hostEntry = gethostbyname(argv[1]);	

   sockaddr_in clientService;
   clientService.sin_family = AF_INET;       
   clientService.sin_addr =  *((LPIN_ADDR)*hostEntry->h_addr_list); // inet_addr("127.0.0.1");
   clientService.sin_port = htons( 80 );

   if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
       printf( "Failed to connect.\n" );
       WSACleanup();
       return 1;
   }

   // Send and receive data.    
   
   if(argc!=3)
   {
              cout<<"Usage:connect_web www.sau.no /index.html";
              return 1;
}

   char sendbuf[2000]="POST ";
   
   strcat(sendbuf, argv[2]);
   strcat(sendbuf, " HTTP/1.1\r\nHost: ");
   strcat(sendbuf, argv[1]);
   strcat(sendbuf, "\r\nUser-Agent: who_cares?\r\n");
   strcat(sendbuf, "Referer: google.com\r\n");
   strcat(sendbuf, "Connection: close\r\n");
   
   strcat(sendbuf, "Content-Type: application/x-www-form-urlencoded\r\n");
   strcat(sendbuf, "Content-Length: 16\r\n");
   
   strcat(sendbuf, "from=faen\r\n");
   strcat(sendbuf, "submit=\r\n\r\n");
   
   
   cout<< sendbuf << "\n";
   char recvbuf[100];
   int bytesRecv;
   
   send( m_socket, sendbuf, strlen(sendbuf), 0 );
   
   
   while(bytesRecv!=SOCKET_ERROR)
   {
   bytesRecv=recv( m_socket, recvbuf, strlen(recvbuf), 0 );
   if(!bytesRecv)
   { break; }
   
    
   cout.write(recvbuf, strlen(recvbuf));
   }  
   
   WSACleanup();
   return 1;
    }

 

Jeg greider å POST'e uten variabler, men når jeg la til

strcat(sendbuf, "from=faen\r\n");
   strcat(sendbuf, "submit=\r\n\r\n");

 

Så fikk jeg:

Request header field is missing ':' separator.<br />

<pre>

from=faen</pre>

 

Jeg har prøvd å lese litt i http rfc, men fant ingen konkrete eksempler.

Hva er feil skal ikke POST variabler komme til slutt?

Lenke til kommentar
Videoannonse
Annonse
http://www.jmarshall.com/easy/http/#othermethods  sjekk denne

 

i alle de andre headerene dine bruker du : for å skille nøkkler og verdier .. så hvorfor du plutselig går over til å bruke = skjønner jeg ikke helt

5532033[/snapback]

Det skal være = på POST variabler, men hva er feil?

Skal det være

....

strcat(sendbuf, "Content-Length: 17\r\n");

strcat(sendbuf, "from=faen\r\n\r\n");

 

Eller

....

strcat(sendbuf, "Content-Length: 17\r\n\r\n");

strcat(sendbuf, "from=faen\r\n");

 

Eller skal strcat(sendbuf, "from=faen\r\n\r\n"); komme før alle andre headere?

 

Noen som vet?

Lenke til kommentar

"from" er en del av headerene - altså ikke en variabel (POST-data) ... ta å les det som står i artikkelen jeg linker til da!

 

edit:

err .. åja, jeg trodde du mente headeren "from" - for den brukes nemlig også..

 

da er det i såfall den andre versjonen av de du henviser til som er riktig

 

strcat(sendbuf, "Content-Length: 17\r\n\r\n");

strcat(sendbuf, "from=faen\r\n");

 

altså to newlines etter headerene..

 

uansett er dette veldig greit forklart i den lille teksen jeg linket til over - med eksempler og alt

Endret av dayslepr
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...