kleiner httpd verbindung klappt danach programm beendet
-
Versuche einen kleinen HTTPD zum laufen zu bekommen.
#include <iostream> #include <string> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/un.h> #include <netinet/in.h> #include <errno.h> #include <signal.h> #include <time.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/ioctl.h> using namespace std; void httpd() { int hsocket, connfd, y; struct sockaddr_in adresse; hsocket = (socket(AF_INET, SOCK_STREAM, 0)); adresse.sin_family = AF_INET; adresse.sin_port = htons (8081); socklen_t adrlaenge = sizeof (struct sockaddr_in); memset (&adresse.sin_addr, 0, sizeof (adresse.sin_addr)); setsockopt(hsocket, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int)); if (bind ( hsocket, (struct sockaddr *) &adresse, sizeof (adresse) ) ) { printf ("Fehler bei bind() ... (%s)\n", strerror(errno)); exit (EXIT_FAILURE); } printf("Server ist bereit und wartet ...\n"); if (listen (hsocket, SOMAXCONN) != 0) { printf ("Fehler bei listen() ... (%s)\n", strerror(errno)); exit (EXIT_FAILURE); } while(accept(hsocket,NULL,NULL)){ send(hsocket,"www.tuxist.de",14,0); } close (hsocket); exit (EXIT_SUCCESS); } int main() { httpd(); }
leider beendet das programm nach einem client aufruf sofort, muss was mit meiner while schlefe nicht stimmen. Könntet ihr mir bitte einen Tipp geben.
-
hi,
also das kannst du so nicht machen. wenn du ein blick in die man-page wirfst dann wirst du erkennen, dass der rückgabewert von accept()
1. null oder auch negativ sein könnte - das würde deien schleife abbrechen und ich nehme an, dass du das ja nicht willst.
2. das handle für den verbundenen client darstellt. du kannst also nicht einfach send() mit dem handle hsocket aufrufen sondern musst das von accept() nehmen. woher soll send() auch wissen an welchen client du daten schicken willst wenn mehrere verbunden sind?
blan
-
du benutzt 1. man: accept(2) falsch und die while Bedingung ist ebenso falsch, denn accept liefert eine nicht-negativen Zahl zurück (die könnte 0 sein) bei Erfolg
int hsocket, client_socket; // hsocket mit socket erstellt, bind, und listen while( (client_socket = accecpt(hsocket,NULL,NULL)) >= 0) { send(client_socket,"www.tuxist.de",14,0); .... close(client_socket); } perror("accept"); exit(EXIT_FAILUE); /* weil eigentlich accept einen Fehler liefert */
-
danke geht jetzt