C++ boost-asio-tcp服务器
我最近一直在和boost混在一起尝试它。当我尝试创建一个简单的多线程echo服务器时,它在接收时退出,错误代码为3。我已经看了很多次文档,但仍然没有运气。我知道这可能是我忽略的一件非常简单的事情。我在winsock方面有丰富的经验,但我想学习boost库 这是失败的代码我拿出了C++ boost-asio-tcp服务器,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,我最近一直在和boost混在一起尝试它。当我尝试创建一个简单的多线程echo服务器时,它在接收时退出,错误代码为3。我已经看了很多次文档,但仍然没有运气。我知道这可能是我忽略的一件非常简单的事情。我在winsock方面有丰富的经验,但我想学习boost库 这是失败的代码我拿出了 typedef boost::shared_ptr<tcp::socket> socket_ptr; boost::asio::io_service io; boost::array<char, 512
typedef boost::shared_ptr<tcp::socket> socket_ptr;
boost::asio::io_service io;
boost::array<char, 512> buf;
void startserver ( std::string host, std::string port )
{
tcp::acceptor a (io, tcp::endpoint(tcp::v4(), atoi(port.c_str())));
for(;;)
{
socket_ptr sock (new tcp::socket(io));
a.accept(*sock);
std::cout << sock->remote_endpoint() << std::endl;
boost::thread t (boost::bind(session, sock));
}
}
void session ( socket_ptr sock )
{
sock->send(boost::asio::buffer("welcome"),0,er);
size_t len;
for(;;)
{
len = sock->receive(boost::asio::buffer(buf));
sock->send(boost::asio::buffer(buf,len),0,er);
}
typedef boost::共享\u ptr套接字\u ptr;
boost::asio::io_服务io;
boost::阵列buf;
void startserver(std::string主机,std::string端口)
{
tcp::acceptor a(io、tcp::endpoint(tcp::v4()、atoi(port.c_str()));
对于(;;)
{
socket_ptr sock(新的tcp::socket(io));
a、 接受(*袜子);
std::cout remote_endpoint()send(boost::asio::buffer(“欢迎”),0,er);
尺寸透镜;
对于(;;)
{
len=sock->receive(boost::asio::buffer(buf));
sock->send(boost::asio::buffer(buf,len),0,er);
}
}
我可以用netcat很好地连接到它,它接收到欢迎消息,但当它接收到它时就崩溃了。我尝试在每个消息上使用boost::system::error_代码捕捉错误,但没有返回任何消息。问题太多。请查看asio文档以获取正确的示例。一些问题:
boost::thread
objectt
,然后立即退出作用域。这会解除线程的连接,现在它是不可控制的;或者,正如前面提到的Joachim Pileborg它可以终止(我对boost::threads不太熟悉,如果我错了,请纠正我)receive
不等待数据,它只获取已经存在的数据包数据(在这种情况下是不正确的)查看boost站点上的示例,我认为您的情况是这很可能是因为线程超出了范围 如果线程是可连接的,那么对std::terminate.destroy的调用会破坏*这个
这意味着当线程启动时,它可能会运行一段时间,然后
startserver
中的线程再次获得控制权,线程对象被破坏,线程被终止。您的函数startserver将产生大量线程,顺便说一句,请注意。我尝试调用io.run()但它也做了同样的事情…@DenisErmolin我认为accept()就像winsock上的阻塞一样,所以它只会根据需要创建线程?