Gå til innhold

Få tak i html kode fra webserver


Anbefalte innlegg

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
Lenke til kommentar
Videoannonse
Annonse

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
Lenke til kommentar

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
Lenke til kommentar

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
Lenke til kommentar
#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);

   }
    

}

Lenke til kommentar

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
Lenke til kommentar

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
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...