Boost asio服务器挂起调用关闭Boost::套接字
boost asio server hangs in call to close boost::socket
下面是我使用boost asio的socket服务器的示例代码。
此服务器将在端口10001上等待任何客户端连接。当任何客户端连接时,它将启动线程从该客户端读取并等待另一个客户端。但是当我的客户端断开连接时,服务器套接字挂在my_socket->close()
调用中会发生什么?
如果新的客户端试图连接服务器崩溃。
我正在使用 g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <sys/socket.h>
#include <unistd.h>
#include <string>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
using namespace std;
using boost::asio::ip::tcp;
void run(boost::shared_ptr<tcp::socket> my_socket)
{
while (1)
{
char buf[128];
boost::system::error_code error;
size_t len = my_socket->read_some(boost::asio::buffer(buf, 128), error);
std::cout << "len : " << len << std::endl;
if (error == boost::asio::error::eof)
{
cout << "t(boost::asio::error::eof)" << endl;
if (my_socket->is_open())
{
boost::system::error_code ec;
cout << "tSocket closing" << endl;
my_socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
cout << "tShutdown " << ec.message() << endl;
// cout << "normal close : " << ::close(my_socket->native_handle()) << endl;
my_socket->close(ec);
cout << "tSocket closed" << endl;
}
break; // Connection closed cleanly by peer.
}
else if (error)
{
std::cout << "Exception : " << error.message() << std::endl;
break;
}
else
{
for (unsigned int i = 0; i < len; i++)
printf("%02x ", buf[i] & 0xFF);
printf("n");
}
}
}
int main()
{
const int S = 1000;
vector<boost::shared_ptr<boost::thread> > arr_thr(S);
try
{
for (uint32_t i = 0;; i++)
{
boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v6(), 10001);
boost::shared_ptr<tcp::socket> my_socket(new tcp::socket(io_service));
tcp::endpoint end_type;
tcp::acceptor acceptor(io_service, endpoint);
std::cout << "before accept" << endl;
acceptor.accept(*my_socket, end_type);
std::cout << "connected... hdl : " << my_socket->native_handle() << std::endl;
boost::asio::ip::address addr = end_type.address();
std::string sClientIp = addr.to_string();
std::cout << "tclient IP : " << sClientIp << std::endl;
arr_thr[i] = boost::shared_ptr<boost::thread>(new boost::thread(&run, my_socket));
}
} catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
启动run
线程后,main中的for循环再次启动,销毁并重新初始化本地io_service
变量,套接字上的下一个事件仍将假设旧的io_service对象,尽管,导致您的崩溃。
您应该只使用一个io_service
实例。
另外,您应该看看boost::asio提供的异步函数,如async_accept
和async_read
,参见以下示例:http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/example/chat/chat_server.cpp
相关文章:
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- boost::asio-async_read_some示例代码没有读取套接字中的所有数据
- C++ 关闭Boost ASIO SSL套接字的最佳方法是什么?
- Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出
- 使用 boost::asio 获取 UDP 套接字远程地址
- 如何在 boost asio 中检测套接字上的关闭连接,而无需阻塞调用
- 如何使用 boost asio 通过 UDP 套接字发送无符号字符的 std::vector?
- 在 boost::asio 中自定义套接字/关闭系统调用
- 是否可以在使用 Boost::asio 之前从套接字读取后执行async_handshake
- 使用 Boost.Asio 将 UDP 套接字绑定到特定网络接口
- BOOST ASYNC_READ延迟(本地套接字)
- 如何通过超时检查Boost ASIO套接字中的数据
- 委托使用 boost asio TCP/IP 套接字
- 在boost asio tcp套接字上接受多个连接
- boost套接字读写功能是否线程安全
- boost套接字通信无法通过一个交换机
- Boost套接字/接收器无法在同一端口上侦听/连接
- Boost asio服务器挂起调用关闭Boost::套接字