2016-07-11 15 views
2

Hallo ich bin ziemlich neu zu verwenden sockets und bin nicht so vertraut mit ihnen noch, Grundsätzlich alles, was ich versuche zu tun ist, übergeben Sie eine string variable zu einem web address (zB www.example.com/index.php?Example=StringExample) und dann eine Antwort erhalten, so zum Beispiel würde es zurückkehren "Test Example" wenn index.php sah wie folgt aus:C++ WinSock Daten von PHP Seite erhalten?

<?php 

if($_GET['Example'] == "StringExample") 
{ 
    echo "Test Example"; 
} 

?> 

Hier ist, was ich in c versucht habe ++:

struct sockaddr_in SocketAddress; 
hostent* addr = gethostbyname("www.example.com/index.php?Example=StringExample"); 
int sizeofaddr = sizeof(addr); 
SocketAddress.sin_addr.s_addr = inet_addr(addr->h_name); 
SocketAddress.sin_port = htons(80); 
SocketAddress.sin_family = AF_INET; 

SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL); 
if (connect(Connection, (SOCKADDR*)&addr, sizeofaddr) != 0) 
{ 
    return 0; //Failed to Connect 
} 

char buffff[256]; 
recv(Connection, buffff, sizeof(buffff), NULL); 
//"Test Example" now stored in buffff 

Was mache ich falsch? In meinem Fall möchte ich keine libraries wie boost oder etwas ähnliches verwenden. Danke für die Hilfe :)

Antwort

4
gethostbyname("www.example.com/index.php?Example=StringExample"); 

„www.example.com/index.php?Example=StringExample“ ist kein gültiger Servernamen. Dies ist eine vollständige URL. Ein Servername wäre "www.example.com". gethostbyname() übernimmt den Namen eines Servers und keine URL und gibt seine IP-Adresse zurück. Darüber hinaus wurde gethostbyname() veraltet. Neuer Code sollte stattdessen die getaddrinfo(3) Funktion verwenden.

Dies ist offensichtlich eine HTTP URL. Um ein Dokument über HTTP herunterzuladen, ist es viel mehr Arbeit, als nur einen Socket zu verbinden. Das Einrichten einer Socket-Verbindung ist nur der erste Schritt beim Herunterladen eines Dokuments von einem HTTP-Server. Danach muss eine gültige HTTP-Anforderung gesendet und anschließend eine HTTP-Antwort vom Server empfangen werden.

Es gibt viele Bibliotheken, z. B. curl, die den gesamten clientseitigen Prozess implementieren, der zum Herunterladen eines HTTP-Dokuments erforderlich ist, das die Socket-Verbindung selbst verarbeitet.

Aber es ist nichts falsch daran, dies auch selbst zu implementieren. Es ist eine gute Programmierung.

So, nach www.example.com ‚s IP-Adresse zu lösen, müssen Sie

1) an den Port 80 des Servers verbinden, die Standard-HTTP-Port.

2) Senden Sie eine HTTP-Anfrage für "/index.php?Example=StringExample".

3) Parsen Sie die HTTP-Antwort.

Die Spezifikation für HTTP-Anforderungen und -Antworten ist definiert durch RFC 2616, die Sie für vollständige Dokumentation der Strukturierung von HTTP-Anforderungen und -Antworten konsultieren können.

1

Wenn Sie einen Web-Server mit Sockets zugreifen möchten, müssen Sie im Auge behalten:

  • können Sie öffnen eine TCP/IP-Verbindung zum Webserver
  • aber danach muss man das tun hTTP-Protokoll selbst

Bei Ihrem Beispiel:

hostent* addr = gethostbyname("www.example.com"); 
//... 
const char* request = "GET index.html" 
send(Connection, request, strlen(request), NULL) 
//fetch index.html with a recv and parse it 

Um mehr Genau, wenn Sie auf Ihren Server zugreifen möchten, müssen Sie einen Blick darauf werfen, wie GET, PUT, POST usw. in das http-Protokoll implementiert werden, die richtigen Befehle an Ihren Webserver senden und die Antworten auf die Antwort