- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
_acce-6ren">
我有一个服务器使用来自 boost 的异步套接字和“接受”函数,如下所示(“用户”几乎等同于 this 示例中的“ session ”):
accept()
{
this->_acceptor.async_accept(this->_socket, [this](boost::system::error_code error)
{
if (!error)
{
make_shared<User>(move(_socket), *this)->read();
}
accept();
});
}
如下所示的“读取”函数(_readData
是一个 1024 的字符数组):
void User::read()
{
auto self(shared_from_this());
this->_socket.async_read_some(boost::asio::buffer(this->_readData, 1024),
[this, self](boost::system::error_code error, size_t length)
{
if (!error)
{
this->buildReceivedMessage(string(this->_readData, length));
this->read();
}
});
}
还有一个“写”函数。
当我用客户端连接到服务器时,从客户端到服务器的第一次传输很顺利,服务器按预期发回响应。然后,我一步步往代码里走,读函数执行完后,代码进入了几个我不认识的头文件,最后抛出“Expression: cannot dereference string iterator because the iterator was invalidated (e.g. reallocation occurred) , 或者字符串已被破坏)”断言问题形成了 xstring
文件。对于我的一生,我不知道为什么。
编辑 1:buildReceivedMessage
创建一个 ReceivedMessage
,其中包含易于访问格式的请求值,然后将其转发给 messageHandler
, 它根据请求的类型转发请求。例如,第一个请求是登录请求,因此 ReceivedMessage
在此函数中结束:
void User::handleSignin(shared_ptr<ReceivedMessage> msg)
{
vector<string> values = msg->getValues();
if (this->_server.getDB().isUserAndPassMatch(values[0], values[1]))
{
if (this->getUserByName(values[0]))
{
this->write("1022");
}
else
{
this->_server.addUser(shared_ptr<User>(this));
this->write("1020");
this->_username = values[0];
}
}
else
{
this->write("1021");
}
}
最佳答案
在:
void User::read()
{
auto self(shared_from_this());
this->_socket.async_read_some(boost::asio::buffer(this->_readData, 1024),
[this, self](boost::system::error_code error, size_t length)
{
if (!error)
{
this->buildReceivedMessage(string(this->_readData, length));
this->read();
}
});
}
你依赖于 shared_ptr self
来保持你的连接。这很好,但是 buildReceivedMessage()
是否也为 self
创建了一个 shared_ptr?
handleSignin()
没有收到 shared_ptr,这让我怀疑你的对象 self
,也就是 this
,真的被销毁了过早地。
我会首先尝试在 User::read()
中使用 self
而不是 this
,以确保捕获 self
不会被优化掉(是的,这是可能的)。我还要确保不要仅仅依靠读取循环来保持连接。
关于c++ - "String iterator not dereferncable" boost async_read_some,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44717311/
我有一个服务器使用来自 boost 的异步套接字和“接受”函数,如下所示(“用户”几乎等同于 this 示例中的“ session ”): accept() { this->_acce
我有一个在启动时初始化驱动程序的脚本,在我启用内核跟踪并重新编译内核以尝试调试某个软件的问题之前,它运行良好。如果我尝试以任何方式(modprobe、insmod 等)初始化驱动程序,此输出将打印到屏
我有一个在启动时初始化驱动程序的脚本,在我启用内核跟踪并重新编译内核以尝试调试某个软件的问题之前,该脚本运行得非常好。如果我尝试以任何方式初始化驱动程序(modprobe、insmod 等),此输出将
我是一名优秀的程序员,十分优秀!