Ich bin ein AspNet-Programmierer mit 57 Jahren. Weil ich der Einzige war, der am Anfang mit C++ gearbeitet hat, baten mich meine Chefs, einen Kunden zu bedienen, der einen Kommunikationsagenten mit sehr spezifischen Eigenschaften braucht. Es kann als Daemon auf mehreren Plattformen ausgeführt werden und gleichzeitig Client und Server sein. Ich weiß nicht genug, aber ich muss das Problem lösen und habe eine Chance in der Boost/Asio-Bibliothek gefunden.Server und Client zur gleichen Zeit mit Boost-Asio
Ich bin neu in Boost-Asio und lese die Dokumentation, die ich einen Server und einen TCP-Socket-Client erstellt, der Nachrichten perfekt und bidirektional, Vollduplex austauscht.
Ich las mehrere Posts, wo sie nach den gleichen Dingen verlangten, die ich möchte, aber alle Antworten schlugen Vollduplex vor, als ob das bedeutete, einen Client und einen Server im gleichen Programm zu haben. Und es ist nicht. Die Definition von Vollduplex bezieht sich auf die Fähigkeit, von derselben Verbindung zu schreiben und zu lesen, und jede TCP-Verbindung ist standardmäßig Vollduplex.
Ich muss dafür sorgen, dass zwei Programme Verbindungen annehmen können, die vom anderen initiiert wurden. Es wird keine dauerhafte Verbindung zwischen den beiden Programmen geben. Manchmal fragt einer von ihnen nach einer Verbindung und zu anderen Zeiten wird der andere diese Anfrage machen und beide müssen zuhören, die Verbindung akzeptieren, einige Nachrichten austauschen und die Verbindung beenden, bis eine neue Anfrage gemacht wird.
Der Server, den ich tat, scheint in den Prozess des Abhörens auf den Port zu hängen, um zu sehen, ob eine Verbindung kommt und ich kann nicht mit dem Prozess fortfahren, einen Socket erstellen und eine Verbindung mit dem anderen anfordern können Programm. Ich brauche Threads, aber ich weiß nicht genug über sie.
Es ist möglich?
Wie gesagt, ich bin neu bei Boost/Asio und habe versucht, einige Dokumente von Threads und Coroutines zu folgen. Dann habe ich den Client-Codes in einem Verfahren und der Server in einem anderen .:
int main(int argc, char* argv[])
{
try
{
boost::thread t1(&server_agent);
boost::thread t2(&client_agent);
// wait
t1.join();
t2.join();
return 0;
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
und zwei Koroutinen:
void client_agent() {
parameters param;
param.load();
boost::asio::io_service io_service1;
tcp::resolver resolver(io_service1);
char port[5];
_itoa(param.getNrPortaServComunic(), port, 10);
auto endpoint_iterator = resolver.resolve({ param.getIPServComunicPrincipal(), port });
std::list<client> clients;
client c(io_service1, endpoint_iterator, param);
while (true)
{
BOOL enviada = FALSE;
while (true) {
if (!enviada) {
std::cout << "sending a message\n";
int nr = 110;
message msg(nr, param);
c.write(msg);
enviada = TRUE;
}
}
}
c.close();
}
void server_agent() {
parameters param;
param.load();
boost::asio::io_service io_service1;
std::list<server> servers;
tcp::endpoint endpoint(tcp::v4(), param.getNrPortaAgenteServ());
servers.emplace_back(io_service1, endpoint);
io_service1.run();
}
Ich benutzen einen Port auf Client-Endpunkt und ander Port Server-Endpunkt. Ist es richtig? Erforderlich?
Es sieht aus, als würde es funktionieren. Jede der Methoden läuft gleichzeitig, aber dann bekomme ich einen Fehler bei der Thread-Zuweisung bei io_service1.run (letzte Zeile der Methode server_agent):
boost :: exception_detail :: clone_impl> am Speicherort 0x0118C61C.
Irgendwelche Vorschläge?
Wie für den Titel, ich bin mir ziemlich sicher, dass Sie eine Vollduplex-Server/Client-Client/Server-Implementierung mit Boost Asio tun können. Aktivieren Sie einfach einen 'boost :: acceptor 'für beide Prozesse und eine Clientverbindung. Behandeln Sie einfach alles asynchron. –
Danke. Ich werde diesen Ansatz versuchen. Es scheint die einzige Möglichkeit zu sein, nicht in einer Schleife stecken zu bleiben. – Neumann