Bonjour,
Je bosse actuellement sur un petit projet.
Je dois faire un petit serveur qui écoute sur le port 18000.
Lorsqu'un client se connecte et envoi ça chaine de caractère, en fonction du deuxième caractère, le serveur lance un thread spécifique, effectue le traitement et renvoie le resulat par la socket du client.
Exemple : le serveur recoit le caractere 'i' : il lance un thread, effectu le traitement (ici mathématique) et renvoit le résultat dans la socket du client
Mon problème c'est de pourvoir transférer proprement la socket à un thread et de pourvoir renvoyer les résultat par cette socket.
Le thread créé lance un foncteur.
Voici mon code
main.cpp
calculFrey
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
47
48
49
50
51
52
53 #include <stdio.h> #include <stdlib.h> #include <string> #include <cstring> #include <unistd.h> #include <boost/asio.hpp> #include <boost/thread/thread.hpp> #include <iostream> #include "calculFrey.h" using boost::asio::ip::tcp; using namespace boost; using namespace std; int main(int argc, char* argv[]) { //On déclare une socket serveur et on écoute try { //Création de la socket et écooute boost::asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 18000)); cout<<"Programme prêt."<<endl; cout<<"Attente des requêtes..."<<endl; //On attends les connections for(;;) { //Attente des connections tcp::socket socket(io_service); acceptor.accept(socket); //Réception de la requête boost::array<char, 128> buf; boost::system::error_code error; socket.read_some(boost::asio::buffer(buf), error); string req=buf.data(); if(req.at(1)=='i') { calculFrey frey(&socket); //Instanciation du fonctor avec l'adresse de la socket client thread t(frey); //Lancement du fonctor dans le thread } } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
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 #ifndef CALCULFREY_H #define CALCULFREY_H #include <boost/asio.hpp> #include <boost/thread/thread.hpp> #include <iostream> using boost::asio::ip::tcp; using namespace boost; using namespace std; /**Classe functor permettant de lancer un calcul pour Frey*/ class calculFrey { private: tcp::socket* sock; public: calculFrey(tcp::socket* sock) { this->sock=sock; cout<<"Adresse de la socket dans le foncteur"<<sock<<endl; } /**Surcharge de l'opérateur () pour faire le functor*/ void operator()(void) { cout<<"Passage dans le functore pour Frey"<<endl; boost::asio::write(*this->sock, boost::asio::buffer("hello !")); } }; #endif // CALCULFREY_H
J'ai une solution qui n'en n'est pas vraiment une car la socket se ferme avant que le thread ne puisse écrire dedans.
Le problème c'est que la connection se ferme dès que le serveur à recu la chaine de caractères le code suivant me lève une exception expliquant que j'utilise un mauvais descripteur de socket :Donc j'ai plusieurs questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part boost::asio::write(*this->sock, boost::asio::buffer("hello !"));
-Comment passer à un foncteur des arguments ?
-Comment faire pour pouvoir envoyer une socket dans le thread et écrire dessus ?
-L'architecture du programme est-elle mauvaise ?
Merci d'avoir prit le temps d'arriver au bout.
Partager