HTTPServer.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. //
  2. // Created by xcbosa on 2023/1/28.
  3. //
  4. #include "HTTPServer.h"
  5. #include "ClientConnection.h"
  6. using namespace std;
  7. namespace xc {
  8. namespace httpserver {
  9. HTTPServer::HTTPServer(ushort bindPort) {
  10. this->bindPort = bindPort;
  11. }
  12. void HTTPServer::serverLoop() {
  13. this->serverSocketFd = socket(PF_INET, SOCK_STREAM, 0);
  14. assertx(this->serverSocketFd != -1, "Socket init failed.");
  15. struct sockaddr_in serverAddress;
  16. serverAddress.sin_family = AF_INET;
  17. serverAddress.sin_port = htons(this->bindPort);
  18. serverAddress.sin_addr.s_addr = INADDR_ANY;
  19. bzero(&(serverAddress.sin_zero), 8);
  20. if (::bind(this->serverSocketFd, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr)) == -1) {
  21. cerr << "Unable to bind port " << this->bindPort << endl;
  22. this->bindPort++;
  23. this->serverLoop();
  24. return;
  25. }
  26. if (listen(this->serverSocketFd, 5) == -1) {
  27. cerr << "Unable to bind port " << this->bindPort << endl;
  28. assertx(0, "");
  29. }
  30. cout << "Bind to 0.0.0.0:" << this->bindPort << endl;
  31. while (true) {
  32. struct sockaddr_in clientAddress;
  33. socklen_t clientAddressSize = sizeof(clientAddress);
  34. int clientSocketFd = accept(this->serverSocketFd, (struct sockaddr*)&clientAddress, &clientAddressSize);
  35. auto client = new ClientConnection(clientSocketFd, clientAddress);
  36. client->workAndDestroy();
  37. }
  38. }
  39. } // xc
  40. } // httpserver