Direkte HTTP-Verbindung (C)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • oO

    wo da "Viel Erfolg!" steht, hätte ich gedacht, dass es gerade
    erst anfängt Oo

    Wo ist in Link 2 denn erklärt, wie man den Quelltext einer
    htm-Datei vom server received???

    Ich würde auch gerne wissen, wie man einen Request
    auf einen webserver schickt und die Antwort received,
    sprich als Beispiel: GET index.php?farbe=rot HTTP/1.0 etc..
  • ich sage ja nur, dass die "Lösung der Übung" das richtige ist. 8)
    Die entsprechende Vorlesungen zu der Übung habe ich auf die Schnelle auch nicht gefunden.

    Aber dafür habe ich noch eine weitere, sehr gute Seite gefunden:
    http://www.zotteljedi.de/doc/socket-tipps/

    Der Beispielclient macht auch eine GET Abfrage auf das Hauptverzeichnis

    Quellcode

    1. snprintf(request, sizeof(request), "GET / HTTP/1.1\r\n"
    2. "Host: %s\r\n"
    3. "Connection: Close\r\n\r\n", hostname);


    Das Programm sollte man dann so erweitern, dass erstmal Domain und Dateipfad seperiert werden und dann eben die Datei mit GET geholt wird.

    Wie die GET Abfrage aussieht zeigt Wikipedia: http://de.wikipedia.org/wiki/Http#HTTP_GET
    GET /wiki/Spezial:Search?search=Katzen&go=Artikel HTTP/1.1
    Host: de.wikipedia.org
  • Ersteinmal vielen Dank für die Antworten.


    Jemand anderes mag mit den Informationen auf den Seiten ja zurechtkommen, ich hingegen tu es leider nicht so ganz.

    Auf http://www.zotteljedi.de/doc/socket-tipps/ steht schon wieder viel zu viel und einen Großteil der Header habe ich nicht einmal, was wohl auch mit Linux <=> Windows zu tun hat.


    Es ist möglicherweise zu viel verlangt, aber ein Beispielcode, der einfach nur rot and http://hallo.de/test.php?farbe= gibt (mehr nicht, Antwort wird nicht benötigt), wäre klasse.

    Ich benutze Dev-C++ v4.9.9.2 auf Windows XP.
  • Quellcode

    1. #include <windows.h>
    2. #include <string>
    3. #include <stdio.h>
    4. #include <iostream>
    5. using namespace std;
    6. int startWinsock (void);
    7. long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
    8. int main (unsigned short argc, char* argv[]) {
    9. long rc = startWinsock();
    10. if (rc != 0) {
    11. printf ("Winsock konnte nicht gestartet werden -> %d\n", rc);
    12. return 1;
    13. }
    14. printf ("Winsock gestartet!\n");
    15. // --- Socket erstellen.
    16. int s = socket(AF_INET, SOCK_STREAM, 0);
    17. if (s == INVALID_SOCKET) {
    18. printf ("Fehler: Socket konnte nicht erstellt werden -> %d\n", WSAGetLastError());
    19. } else {
    20. printf ("Socket erstellt!\n");
    21. // --- Abfragen, zu welchem host verbinden.
    22. char host[] = "hallo.de";
    23. // --- Socket an einen Host verbinden.
    24. sockaddr_in addr;
    25. addr.sin_family = AF_INET;
    26. addr.sin_port = htons(80);
    27. rc = getAddrFromString(host, &addr);
    28. if (rc == SOCKET_ERROR) {
    29. printf ("IP für %s konnte nicht aufgeloest werden\n", host);
    30. return 1;
    31. }
    32. printf ("IP aufgeloest!\n");
    33. // --- Prüfen, ob Host existiert.
    34. rc = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    35. if (rc == -1) {
    36. printf ("Konnte nicht zum Server verbinden!\n");
    37. return 1;
    38. }
    39. printf ("Verbunden!\n");
    40. // --- Request an Host.
    41. string req = "";
    42. req += "GET /test.php?farbe=rot HTTP/1.0\r\n";
    43. req += "Host: "; req += host; req += "\r\n\r\n";
    44. if (!send(s, req.c_str(), req.length(), 0)) {
    45. printf ("Request konnte nicht gesendet werden!\n");
    46. return 1;
    47. }
    48. cout << endl << "--- --- REQ --- ---" << endl << req << endl << "--- --- --- --- ---" << endl << endl;
    49. }
    50. system ("PAUSE");
    51. return 0;
    52. }
    53. int startWinsock (void) {
    54. WSADATA wsa;
    55. return WSAStartup(MAKEWORD(2,0),&wsa);
    56. }
    57. long getAddrFromString (char* hostnameOrIp, SOCKADDR_IN* addr) {
    58. long rc;
    59. unsigned long ip;
    60. HOSTENT* he;
    61. /* Parameter prüfen */
    62. if (hostnameOrIp==NULL || addr==NULL)
    63. return SOCKET_ERROR;
    64. /* eine IP in hostnameOrIp ? */
    65. ip = inet_addr(hostnameOrIp);
    66. /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
    67. if(ip != INADDR_NONE) {
    68. addr->sin_addr.s_addr=ip;
    69. return 0;
    70. } else {
    71. /* Hostname in hostnameOrIp auflösen */
    72. he = gethostbyname(hostnameOrIp);
    73. if (he == NULL) {
    74. return SOCKET_ERROR;
    75. } else {
    76. /*die 4 Bytes der IP von he nach addr kopieren */
    77. memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
    78. }
    79. return 0;
    80. }
    81. }
    Alles anzeigen