Gå til innhold

Få tak i html kode fra webserver


Anbefalte innlegg

Skrevet (endret)

Hvorfor funker ikke dette:

#include <stdio.h>
#include "winsock.h"
#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {

   // 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.
   sockaddr_in clientService;
   clientService.sin_family = AF_INET;       
   clientService.sin_addr.s_addr = inet_addr("193.69.165.21"); // vg.no
   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.    
   char sendbuf[32]="GET / HTTP/1.1";
   
   char recvbuf[4000];
   
  int bytesRecv;


   
   
   send( m_socket, sendbuf, strlen(sendbuf), 0 );
   
   bytesRecv=recv( m_socket, recvbuf, strlen(recvbuf), 0 );
   if ( bytesRecv == -1 )
       {
           printf( "Connection Closed.\n");
           WSACleanup();
           return 1;
       }
cout<< recvbuf;
    

}

 

Det bare står å blinker og ingenting skjer.

Endret av willbend
Videoannonse
Annonse
Skrevet (endret)

du må sende to newlines etter GET-headeren din

 

edit:

husk at "newline" er definert som CRLF i HTTP-spec'en .. så du må sende to tegn.. mener det er \r\n i C, om jeg husker rett (der \r da står for CR og \n for LF)

Endret av dayslepr
Skrevet (endret)

Jeg skiftet "GET / HTTP/1.1" til "GET / HTTP/1.1\n\n" og "cout<< recv" til "cout<< recvbuf" men fikk ingen html kode, det ble bare blankt

 

EDIT: GET / HTTP/1.1\r\n da blinker det bare

GET / HTTP/1.1\n\r det samme

GET / HTTP/1.1\n\n programmer avslutter men printer ut ingenting

Endret av willbend
Skrevet (endret)

Hvis vi har char recvbuf[4000];

 

Hvis jeg skifter str. til 30 eller 60 da får jeg starten av html koden, men hvis jeg endrer til 100, 200 fikk jeg bare "HTT", skifter jeg til 1000 får jeg ingenting

 

Jeg tror det har noe med str. på packets å gjøre?

Må jeg pakke recv inni en loop eller no ?

Endret av willbend
Skrevet

Når jeg bruker denne koden

while(bytesRecv != -1)

{

 

bytesRecv=recv( m_socket, recvbuf, strlen(recvbuf), 0 );

cout<< recvbuf;

}

 

Da får jeg all html koden osv. men på slutten får jeg masse

l>

l>

l>

l>

 

Hva er det fornoe ?

Skrevet (endret)

når cout får en peker til en char så skriver den ut tegn helt til den treffer tegnet \0

 

bruk std::write(recvbuf, bytesRecv);

Endret av dayslepr
Skrevet
#include <stdio.h>
#include "winsock.h"
#include <iostream>
#include <fstream>

using namespace std;
int main(int argc, char *argv[]) {

   // 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.
   sockaddr_in clientService;
   clientService.sin_family = AF_INET;       
   clientService.sin_addr.s_addr = inet_addr("194.63.248.47");
   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.    
   char sendbuf[60]="GET / HTTP/1.1\r\n\r\n";
   
   char recvbuf[30];
   
  int bytesRecv;


   
   
   send( m_socket, sendbuf, strlen(sendbuf), 0 );
   
   while(bytesRecv != -1)
   {
   
   bytesRecv=recv( m_socket, recvbuf, strlen(recvbuf), 0 );
   std::write(recvbuf, bytesRecv);

   }
    

}

Skrevet (endret)

finner ut hva du skal gjøre

 

edit:

«hvordan kommer man frem til "hvem, hva, hvor"»? da finner du sikkert selv ut hvorfor, og da vet du hvordan

Endret av dayslepr
Skrevet (endret)

det er fordi den "står fast" et sted .. den står sansynligvis å venter på noe

 

fyr opp Linux og skriv man recv .. tast så /wait (søk på ordet wait)

 

bruk en debugger og stepp deg igjennom koden skritt for skritt .. da ser du hvor den venter .. (edit: du stiller spørsmål som en 5-åring når du sier "den står bare å blinker" .........)

Endret av dayslepr
Skrevet (endret)

Uten å ha studert koden din alt for nøye så ser det i hvert fall ut som at du har et buffer-problem.

 

Du bør lage en egen socket-klasse som har recv_all() og send_all() funksjoner. Dette vil forenkle din hverdag betydelig. Her er eksempel på en ikke-optimalisert recv_all() som du kan bruke i programmet ditt:

 

#include <vector>

int recv_all(SOCKET sock, std::vector<char> & buffer)
{
   static const int BLOCKSIZE = 4096;

   int bytes_read=0, offset=0;

   buffer.resize(BLOCKSIZE * 2);
   char* dst = &buffer[0];

   while(0 < (bytes_read = recv(sock, dst, BLOCKSIZE, 0)) )
   {
       offset += bytes_read;

       buffer.resize(offset + BLOCKSIZE);

       dst = &buffer[0] + offset;
   }

   buffer.resize(offset);

   return offset;
}

 

Du kan bruke den slik:

 

std::vector<char> buffer;

if(recv_all(m_socket, buffer))
{
   buffer.push_back(0);
   std::cout << &buffer[0] << std::endl;
}

 

Du bør også lese sjekke ut select()-funksjonen for å gjøre koden din mer robust. Du kan f.eks. lage en is_readable() funksjon som tar en timeout som parameter.

 

Lykke til.

 

 

Edit: 2 leifer

Endret av kjetil7

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...