c++ - Boost-ASIO-Netzwerk-server/client
Ich habe ein Programm geschrieben, für client und server. Das Programm verfügt momentan die folgenden:
- Server überwacht, um einen Endpunkt für die Verbindung
- Client eine Verbindung zum server
- server sendet die Nachricht zum akzeptieren einer Verbindung
- client empfängt die Nachricht
Ich bin dabei asynchron. Aber, das problem ist, Sie kann nur senden/empfangen einer Nachricht. Danach, Sie einfach zu kündigen. Unten ist mein code:
#include <iostream>
#include <vector>
#include<boost/asio.hpp>
std::vector<char> buff(256);
void SendHandler(boost::system::error_code ex){
std::cout << " do something here" << std::endl;
}
void ReadHandler(boost::system::error_code ex){
std::cout << " print the buffer data..." << std::endl;
std::cout << buff.data() << std::endl;
}
void Server(){
boost::asio::io_service service;
using namespace boost::asio::ip;
tcp::endpoint endpoint(tcp::v4(), 4000);
tcp::acceptor acceptor(service, endpoint);
tcp::socket socket(service);
std::cout << "[Server] Waiting for connection" << std::endl;
acceptor.accept(socket);
std::cout << "[Server] Accepted a connection from client" << std::endl;
std::string msg = "Message from server";
socket.async_send(boost::asio::buffer(msg), SendHandler);
service.run();
}
void Client(){
boost::asio::io_service service;
using namespace boost::asio::ip;
tcp::endpoint endpoint(address::from_string("127.0.0.1"), 4000);
tcp::socket socket(service);
std::cout << "[Client] Connecting to server..." << std::endl;
socket.connect(endpoint);
std::cout << "[Client] Connection successful" << std::endl;
socket.async_read_some(boost::asio::buffer(buff), ReadHandler);
service.run();
}
int main(int argc, char **argv) {
if(argc == 1){
std::cout << "Please specify s for server or c for client" << std::endl;
return -1;
}
if(argv[1][0] == 's'){
Server();
}
else{
Client();
}
return 0;
}
Ich skalieren möchten dieses Programm so, dass:
- server hören können, und der client kann die Anfrage senden, auf unbestimmte Zeit. Mehr wie ein one-way-chat-system.
- - server in der Lage, eine Verbindung zu mehreren clients.
Setzen die async_send()
und service.run()
in einer unendlichen Schleife nicht helfen. Es druckt nur die Nachricht wieder und wieder auf der client-Seite, bis der client beendet wird.
Ich bin Recht neu auf boost::asio
sogar network programming
. Bitte sagen Sie mir, wo und was sollte ich ändern in meinem code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beginnen mit dem lernen einige der Grundlagen. Es gibt sehr gute tutorials und Beispiele zur Verfügung gestellt von der Bibliothek, spazieren Sie durch die Konzepte und Beispiele für synchrone und asynchrone Server.
http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio.html
Am Anfang beginnen. Arbeiten Sie die grundlegenden Konzepte mit Timer und Rückrufe. Weiter mit dem tutorial in das Netzwerk. Bauen auf die Kern-Ideen, die im Laufe ein paar Stunden durch die Bearbeitung der tutorial-Programme auszuprobieren, Ideen auf eigene Faust.
Dann arbeiten Sie Ihren Weg über den Abschnitt "Beispiele". Der 'Chat' - Beispiel ist wirklich in der Nähe, was Sie suchen, zu bauen. Dieses spezielle Beispiel zeigt, wie die verbindungen zu öffnen, durch die Neuausstellung async_reads in der lese-Handler. Asynchrone asio-Server mehrere clients bedienen solange der service-threads, die weiterhin mit den zugeordneten async_accept Aufgabe.
http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/examples/cpp11_examples.html
http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp