我是一位57岁的AspNet程序员。因为我是唯一一个在一开始就用C++工作的人,所以我的老板们要求我为一个需要具有非常特定特征的沟通代理的客户提供服务。它可以在多个平台上作为守护程序运行,并且有时可以是客户端和服务器。我不够了解,但我必须解决问题,并在Boost/Asio图书馆找到机会。服务器和客户端同时使用Boost-Asio
我是Boost-Asio的新手,并阅读文档,我创建了一个服务器和一个TCP套接字客户端,可以完美地交换消息并双向全双工。
我读了几篇文章,他们询问我想要的东西,但所有答案都提示全双工,就好像这意味着在同一个程序中有一个客户端和一台服务器。事实并非如此。全双工的定义是指从同一连接写入和读取的能力,默认情况下每个TCP连接都是全双工。
我需要让两个程序可以接受另一个发起的连接。这两个方案之间不会有永久性的联系。有时候他们中的一个会要求连接,而另一个则会提出这个请求,并且都需要监听,接受连接,交换一些消息并终止连接,直到发出新的请求。
我所做的服务器似乎陷入了侦听端口的过程中,看看是否有连接进入,并且我无法继续进程以便能够创建套接字并请求与其他端口的连接程序。我需要线索,但我对他们不够了解。
这可能吗?
正如我所说我是Boost/Asio的新手,我试图遵循一些线程和协程的文档。然后,我把客户端代码在一个方法和服务器在另一:
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;
}
和两个协程:
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();
}
我用一个端口到客户终端和其他端口服务器端点。这是对的吗?需要?
它开始看起来像它会工作。每种方法都同时运行,但是随后在io_service1.run(server_agent方法的最后一行)处发生线程分配错误:
boost :: exception_detail :: clone_impl>在内存位置0x0118C61C处。
有什么建议吗?
至于标题,我敢肯定你可以做一个全双工服务器/客户端客户端/服务器实施与升压asio。只需为进程和客户端连接启用'boost :: acceptor'即可。只是异步处理一切。 –
谢谢。我会尝试这种方法。这似乎是唯一不会陷入循环的方法。 – Neumann