unkn0wn107 / webserv

Simple and fast c++ http/1.1 server === 42 Lyon
GNU General Public License v3.0
0 stars 0 forks source link

Multithreading pour gérer plusieurs connexions simultanément ? #6

Closed ZEDIUM-Off closed 5 months ago

ZEDIUM-Off commented 6 months ago

Je pense que le multithreading est implicitement demandé dans le sujet. Sans on ne peux pas gérer simultanément l'écoute de plusieurs ports ou même des connections simultanées.

Image

J'ai donc testé l'utilisation des threads en c98 : Image

#include "ConfigLoader.hpp"
#include "Server.hpp"
#include <thread>

int main(int argc, char* argv[]) {
  if (argc > 2)
    ErrorHandler::fatal("Too many arguments. usage : ./webserv [config_path]");

  std::map<std::string, std::string> config;
  try {
    ConfigLoader& config = ConfigLoader::getInstance();
    if (argc == 1)
      config.loadConfig(ConfigLoader::DEFAULT_FILE_NAME);
    else if (argc == 2)
      config.loadConfig(argv[1]);
    Server* server = new Server();
    server->start();
  } catch (const std::exception& e) {
    ErrorHandler::exception(e);
    return EXIT_FAILURE;
  }

  std::thread t1(callable);

    // Wait for t1 to finish
    t1.join();

    // t1 has finished do other stuff
    Statements;
  return EXIT_SUCCESS;
}
make    
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/Server.cpp -o obj/Server.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/ConfigLoader.cpp -o obj/ConfigLoader.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/FileManager.cpp -o obj/FileManager.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/ConnectionHandler.cpp -o obj/ConnectionHandler.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/ErrorHandler.cpp -o obj/ErrorHandler.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/Logger.cpp -o obj/Logger.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/Utils.cpp -o obj/Utils.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/HTTP1_1.cpp -o obj/HTTP1_1.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/HTTPRequest.cpp -o obj/HTTPRequest.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/HTTPResponse.cpp -o obj/HTTPResponse.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/CGIHandler.cpp -o obj/CGIHandler.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/FileHandler.cpp -o obj/FileHandler.o
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3 -c src/main.cpp -o obj/main.o
.log already in .gitignore
g++ -Wall -Wextra -Werror -MMD -std=c++98 -fsanitize=address -g3  obj/Server.o  obj/ConfigLoader.o  obj/FileManager.o  obj/ConnectionHandler.o  obj/ErrorHandler.o  obj/Logger.o  obj/Utils.o  obj/HTTP1_1.o  obj/HTTPRequest.o  obj/HTTPResponse.o  obj/CGIHandler.o  obj/FileHandler.o  obj/main.o -o webserv
mkdir -p ./logs

Tout compile en C98 je suppose donc que ce n'est pas interdit, dans le sujet il y a écrit External Functions et pas Authorized.

Il faudrait donc réfléchir a une implémentation multi-threadée du programme. Comme je vous l'ai expliqué sur discord, un port peux écouter pour plusieurs virtual server. Il faut donc lancer un thread pour chaque écoute de port. Peut être même ensuite pour chaque virtual server (pour gérer les requêtes simultanées).

Pour cela j'ai pensé a une classe PortListener qui lancera un thread pour chaque instanciations, on donnera au thread une routine pour ecouter sur le port configuré.

Il faudrait donc une classe RequestBroker qui pourrait rediriger la requête pour le server name (host) en header.

Ensuite chaque virtual server répond en fonction de sa config.

Qu'en pensez vous ? D'autres idées ?