Client Handler
The ClientHandler component owns the client socket registry, epoll state, and reusable
receive buffers used by Client objects.
Program Logic
Add Client
Called from Main::Server on new Client Socket.
Make the accepted socket non-blocking
Create a
Clientinstance with the file descriptor and a reusable buffer segmentInsert the client object into the internal map
Add the file descriptor to epoll using
EPOLLIN | EPOLLET
Workflow diagram see: Add Client.
Process Clients
Get all Epoll FDs with waiting data.
Note
If 5,000 clients are currently connected and 2,000 have pending buffered data, the system outputs an array containing the 2,000 corresponding file descriptor integers.
Reset ProcessedClients, call epoll_wait(), and pass the ready descriptors to
readClientData() when data is available.
Workflow diagram see: Process Clients.
Read Client Data
Process all file descriptors with waiting data.
Iterate over each ready epoll entry
Look up the client in the active client map
Call
Client::receiveData()On EOF or a hard receive error, erase the client entry and close the socket
The current source keeps request buffering and HTTP parsing on each Client instance and no
longer routes the read path through a separate result-processing stage.
Workflow diagram see: Read Client Data.