Bonjour,

j'apprend actuellement le C++ afin d'accélérer quelques programmes sur mon serveur, et pour cela, j'ai décidé de réaliser un serveur HTTP multi-clients.

Je ne veux pas utiliser de librairies telles que boost, je préfère tout re-coder moi-même afin de vraiment tout comprendre.

Mais, je débute et rencontre déjà des problèmes Si je suis correct, pour réaliser un serveur HTTP, je dois gérer manuellement les sessions TCP, pour cela mon programme débute par une classe TCP_Server.

Voici le code que j'ai déjà écrit pour cette classe, tout a l'air de fonctionner pour le moment.

Header file:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#include <iostream>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <thread>
 
class TCP_Server {
public:
    // Constructor
    TCP_Server();
private:
    // Socket descriptor
    int m_socket_desc;
    // 
    struct sockaddr_in m_server;
};
Source file:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
#include "TCP_Server.h"
 
TCP_Server::TCP_Server() {
    // Creating a socket
    m_socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    if (m_socket_desc == -1) {
        std::cout << "Could not create socket" << std::endl;
    }
    else
    {
        std::cout << "Server started" << std::endl;
    }
 
    // Prepare the sockaddr_in structure
    m_server.sin_family = AF_INET;
    m_server.sin_addr.s_addr = INADDR_ANY;
    m_server.sin_port = 80;
 
    // Bind it
    // bind() return 0 when there is no problem
    if (bind(m_socket_desc, (struct sockaddr*)&m_server, sizeof(m_server)) != 0) {
        std::cout << "Bind failed" << std::endl;
    }
    else
    {
        std::cout << "Socket binded on port " << m_server.sin_port << std::endl;
    }
 
    // Put the server on (with a pending queue of 15)
    // listen() is a command used for listening to TCP handshake requests
    // listen() return 0 when there is no problem
    if (listen(m_socket_desc, 15) != 0) {
        std::cout << "Listen failed" << std::endl;
    }
    else
    {
        std::cout << "Server started" << std::endl;
    }
 
    // Create a new thread for each new TCP session when a SYN request has been detected
    while (1) {
        std::cout << "Waiting for connections ..." << std::endl;
        // std::thread thread...
    }
}
Si j'ai bien compris, je dois maintenant créer un nouveau thread pour chaque session TCP, lançant la méthode accept() qui va effectuer le TCP handshake ... Mais après avoir lu des dizaines de tutos en C et C++, je n'y arrive pas

Donc je me permet de demander un petit coup de pouce de votre part

Pour info, je code pour les plateformes debian / centOS / OSX.