12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- //
- // Created by xcbosa on 2023/1/28.
- //
- #include "HTTPServer.h"
- #include "ClientConnection.h"
- using namespace std;
- namespace xc {
- namespace httpserver {
- HTTPServer::HTTPServer(ushort bindPort) {
- this->bindPort = bindPort;
- }
- void HTTPServer::serverLoop() {
- this->serverSocketFd = socket(PF_INET, SOCK_STREAM, 0);
- assertx(this->serverSocketFd != -1, "Socket init failed.");
- struct sockaddr_in serverAddress;
- serverAddress.sin_family = AF_INET;
- serverAddress.sin_port = htons(this->bindPort);
- serverAddress.sin_addr.s_addr = INADDR_ANY;
- bzero(&(serverAddress.sin_zero), 8);
- if (::bind(this->serverSocketFd, (struct sockaddr *)&serverAddress, sizeof(struct sockaddr)) == -1) {
- cerr << "Unable to bind port " << this->bindPort << endl;
- this->bindPort++;
- this->serverLoop();
- return;
- }
- if (listen(this->serverSocketFd, 5) == -1) {
- cerr << "Unable to bind port " << this->bindPort << endl;
- assertx(0, "");
- }
- cout << "Bind to 0.0.0.0:" << this->bindPort << endl;
- while (true) {
- struct sockaddr_in clientAddress;
- socklen_t clientAddressSize = sizeof(clientAddress);
- int clientSocketFd = accept(this->serverSocketFd, (struct sockaddr*)&clientAddress, &clientAddressSize);
- auto client = new ClientConnection(clientSocketFd, clientAddress);
- client->workAndDestroy();
- }
- }
- } // xc
- } // httpserver
|