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:
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 #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; };
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
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... } }
Donc je me permet de demander un petit coup de pouce de votre part
Pour info, je code pour les plateformes debian / centOS / OSX.
Partager