2016-07-28 21 views
0

Ich versuche, den HTML-Code dieser Seite http://pastebin.com/raw/7y7MWssc mit C zu bekommen. Bisher versuche ich, Pastebin mit Sockets & Port 80 zu verbinden, und verwenden Sie dann eine HTTP-Anfrage, um HTML zu erhalten auf dieser Pastebin-Seite.C-Sprache, HTML-Quelle

weiß ich, was ich bisher wahrscheinlich weg ist, aber hier ist es:

#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

int main() 
{ 
    /*Define socket variables */ 
    char host[1024] = "pastebin.com"; 
    char url[1024] = "/raw/7y7MWssc"; 
    char request[2000]; 
    struct hostent *server; 
    struct sockaddr_in serverAddr; 
    int portno = 80; 

    printf("Trying to get source of pastebin.com/raw/7y7MWssc ...\n"); 

    /* Create socket */ 
    int tcpSocket = socket(AF_INET, SOCK_STREAM, 0); 
    if(tcpSocket < 0) { 
     printf("ERROR opening socket\n"); 
    } else { 
     printf("Socket opened successfully.\n"); 
    } 

    server = gethostbyname(host); 
    serverAddr.sin_port = htons(portno); 
    if(connect(tcpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) { 
     printf("Can't connect\n"); 
    } else { 
     printf("Connected successfully\n"); 
    } 

    bzero(request, 2000); 
    sprintf(request, "Get %s HTTP/1.1\r\n Host: %s\r\n \r\n \r\n", url, host); 
    printf("\n%s", request); 

    if(send(tcpSocket, request, strlen(request), 0) < 0) { 
     printf("Error with send()"); 
    } else { 
     printf("Successfully sent html fetch request"); 
    } 
    printf("test\n"); 

} 

Der obige Code Sinn zu einem gewissen Punkt gemacht, und jetzt verwirrt ich bin. Wie würde ich diese Webquelle von http://pastebin.com/raw/7y7MWssc bekommen?

+0

1) entfernen Sie die zusätzlichen Leerzeichen am Anfang der Linien in der Anfrage, 2) Änderung zu holen , 3) empfange die Antwort und drucke es – immibis

+0

@immibis getan, aber es gibt immer noch ein Problem, nachdem ich die Anfrage in Zeile 38 drucke, da die letzte Zeile, wo es "Test" druckt, nie ausgeführt wird – BotHam

+0

Es wird "nie ausgeführt"? Also, dein Programm ist ... mit einem Fehler beenden? Hängend? Wenn es hängt, auf welcher Linie hängt es fest? Wenn es einen Fehler gibt, was ist das? – larsks

Antwort

2

Feste, ich brauchte

serverAddr.sin_family = AF_INET; 

und bzero ServerAddr einzustellen hinzufügen und auch meine HTTP-Anforderung falsch war, es hatte einen zusätzlichen/r/n und Räume, wie @immibis sagte.

Korrigiert:

sprintf(request, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", url, host); 
1

Sie die von gethostbyname zurückgegebene Zeiger immer(), aber man damit nichts taten.

Sie müssen die Sockaddr_in mit der Adresse, Domäne und Port füllen.

Dies funktioniert ... aber jetzt müssen Sie über den Erhalt der Antwort kümmern ...

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 

int main() 
{ 
    /*Define socket variables */ 
    char host[1024] = "pastebin.com"; 
    char url[1024] = "/raw/7y7MWssc"; 
    char request[2000]; 
    struct hostent *server; 
    struct sockaddr_in serverAddr; 
    short portno = 80; 

    printf("Trying to get source of pastebin.com/raw/7y7MWssc ...\n"); 

    /* Create socket */ 
    int tcpSocket = socket(AF_INET, SOCK_STREAM, 0); 
    if(tcpSocket < 0) { 
     printf("ERROR opening socket\n"); 
     exit(-1); 
    } else { 
     printf("Socket opened successfully.\n"); 
    } 

    if ((server = gethostbyname(host)) == NULL) { 
     fprintf(stderr, "gethostbybname(): error"); 
     exit(-1); 
    } 

    memcpy(&serverAddr.sin_addr, server -> h_addr_list[0], server -> h_length); 
    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_port = htons(portno); 

    if(connect(tcpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) { 
     printf("Can't connect\n"); 
     exit(-1); 
    } else { 
     printf("Connected successfully\n"); 
    } 

    bzero(request, 2000); 
    sprintf(request, "Get %s HTTP/1.1\r\n Host: %s\r\n \r\n \r\n", url, host); 
    printf("\n%s", request); 

    if(send(tcpSocket, request, strlen(request), 0) < 0) { 
     printf("Error with send()"); 
    } else { 
     printf("Successfully sent html fetch request"); 
    } 
    printf("test\n"); 

}