Einfacher httpd Server libmicrohttpd

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
darkwin
Beiträge: 26
Registriert: So Aug 08, 2021 4:37 pm

Einfacher httpd Server libmicrohttpd

Beitrag von darkwin » Sa Sep 04, 2021 2:48 pm

Hallo, mein C Programm was ich geschrieben habe ist praktisch fertig und macht was es soll.
Nun würde ich das Programm gern über eine kleine Webseite steuern und die Ausgabe möglichst live darstellen.
Heißt mein C Programm soll wenn es läuft einen Port öffnen und ich möchte mit einem Webbrowser darauf zugreifen.

Mit Arduino gibt es unzählige Beispiele wie ein http Zugriff auf ein esp Chips zu realisieren ist.

Ich dachte cool das bekommste ja leicht selbst hin. Aber ich scheitere seit Tagen daran nur das kleinste Beispiel zum laufen zu bekommen.

Z.b. habe ich unter Linux libmicrohttpd (https://www.gnu.org/software/libmicrohttpd/ )installiert und probiere nun das mini Beispiel von der Webseite aus.
Nur bricht es mir egal was ich ausbprobiere immer mit einer Fehlermeldungen ab.

Beim Kompilieren der Beispieldatei bekomme ich z.b. diese Fehlermeldung:

Code: Alles auswählen

/usr/bin/ld: /tmp/ccNZeGxU.o: in function `ahc_echo':
http-server.c:(.text+0xb2): undefined reference to `MHD_create_response_from_buffer'
/usr/bin/ld: http-server.c:(.text+0xcb): undefined reference to `MHD_queue_response'
/usr/bin/ld: http-server.c:(.text+0xda): undefined reference to `MHD_destroy_response'
/usr/bin/ld: /tmp/ccNZeGxU.o: in function `main':
http-server.c:(.text+0x15f): undefined reference to `MHD_start_daemon'
/usr/bin/ld: http-server.c:(.text+0x190): undefined reference to `MHD_stop_daemon'
collect2: error: ld returned 1 exit status
Das ist das mini Beispiel:

Code: Alles auswählen

#include "microhttpd.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define PAGE "<html><head><title>libmicrohttpd demo</title>"\
             "</head><body>libmicrohttpd demo</body></html>"

static enum MHD_Result
ahc_echo(void * cls,
         struct MHD_Connection * connection,
         const char * url,
         const char * method,
         const char * version,
         const char * upload_data,
         size_t * upload_data_size,
         void ** ptr) {
  static int dummy;
  const char * page = cls;
  struct MHD_Response * response;
  int ret;

  if (0 != strcmp(method, "GET"))
    return MHD_NO; /* unexpected method */
  if (&dummy != *ptr)
    {
      /* The first time only the headers are valid,
         do not respond in the first round... */
      *ptr = &dummy;
      return MHD_YES;
    }
  if (0 != *upload_data_size)
    return MHD_NO; /* upload data in a GET!? */
  *ptr = NULL; /* clear context pointer */
  response = MHD_create_response_from_buffer (strlen(page),
                                              (void*) page,
  					      MHD_RESPMEM_PERSISTENT);
  ret = MHD_queue_response(connection,
			   MHD_HTTP_OK,
			   response);
  MHD_destroy_response(response);
  return ret;
}

int main(int argc,
	 char ** argv) {
  struct MHD_Daemon * d;
  if (argc != 2) {
    printf("%s PORT\n",
	   argv[0]);
    return 1;
  }
  d = MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION,
		       atoi(argv[1]),
		       NULL,
		       NULL,
		       &ahc_echo,
		       PAGE,
		       MHD_OPTION_END);
  if (d == NULL)
    return 1;
  (void) getc (stdin);
  MHD_stop_daemon(d);
  return 0;
}
Kann mir jemand einen Tipp geben was hier schief läuft?
Ich bin auch nicht verpicht darauf libmicrohttpd zu nutzen.
Wenn jemand eine andere Lösung dafür hat, nehme ich das auch gern.
Mir ist nur wichtig das die Webseite direkt auf dem Programm selbst erzeugt wird und ich kein Apache Server installieren muss.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einfacher httpd Server libmicrohttpd

Beitrag von Xin » So Sep 05, 2021 7:07 am

Wie rufst Du den Compiler auf? Ich vermute, da fehlt ein -lmicrohttpd im Aufruf, um die Library "libmicrohttpd" dem Linker bekannt zu geben.
Der Compiler ist mit Deinem Programm nämlich soweit zufrieden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

darkwin
Beiträge: 26
Registriert: So Aug 08, 2021 4:37 pm

Re: Einfacher httpd Server libmicrohttpd

Beitrag von darkwin » So Sep 05, 2021 9:59 am

Hallo, Danke das war es.

Kannst du mir das bitte genauer erklären?
Also ich habe eine Headerdatei die ich oben im Code angebe.
Warum ist dann der Linker Eintrag nötig?

Ich Programmiere mit Visual Studio Code.
Wenn ich das Programm kompiliere wird mit in der Ausgabe
gcc http-server.c -o http-server

angezeigt.

Mit gcc http-server.c -o http-server -lmicrohttpd hat es dann funktioniert.

Das Kompilieren mache ich mit einer Erweiterung. Code Runner. So muss ich nur noch strg + Alt + n drücken.

Aus dem Übungsbuch habe ich ein kleines Beispiel abgetippt. Das Beispiel nutzt eine Headerdatei ich ich dann ebenfalls abgetippt habe.
Dort musste ich den Linker Befehl nicht nutzen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einfacher httpd Server libmicrohttpd

Beitrag von Xin » Mo Sep 06, 2021 10:47 am

darkwin hat geschrieben:
So Sep 05, 2021 9:59 am
Hallo, Danke das war es.

Kannst du mir das bitte genauer erklären?
Also ich habe eine Headerdatei die ich oben im Code angebe.
Warum ist dann der Linker Eintrag nötig?
Weil der Compiler Objekt-Files erzeugt. Jede .cpp-Datei wird zu einer .o-Datei.
Die Headerdatei behauptet, dass es die Funktion "MHD_create_response_from_buffer" irgendwo gibt. Also meckert der Compiler nicht.
Der Linker nimmt dann alle .o-Dateien und muss dann die Funktionsaufrufe zusammenführen. Die "MHD_create_response_from_buffer" findet er aber nicht, deswegen kommt ein Linker-Fehler. Die Funktion befindet sich in der Library "microhttpd".

Aber von wo sich Dein Programm jetzt die Funktoin "MHD_create_response_from_buffer" holt, darfst Du dem Linker sagen. Du könntest jetzt auch eine andere Library nehmen, die die Funktion ebenfalls implementiert. So kannst Du beispielsweise alternativ Debug-Versionen benutzen, wenn Du mal was testen möchtest, ohne alles neu kompilieren zu müssen.
darkwin hat geschrieben:
So Sep 05, 2021 9:59 am
Aus dem Übungsbuch habe ich ein kleines Beispiel abgetippt. Das Beispiel nutzt eine Headerdatei ich ich dann ebenfalls abgetippt habe.
Dort musste ich den Linker Befehl nicht nutzen.
Dann nutzt Dein Beispiel auch keine externe Library.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten