- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个发送和接收纯文本的小型 boost asio tcp 服务器和客户端。通信或多或少是请求响应。在测试期间,我想我只是向服务器发送垃圾数据,向它发送 100.000 个请求。
客户端发送给服务器的消息:
\n=BEGIN 1,test\n
Hello World: 1
\n=END\n
在上面的消息中,计数器从 0 变为 99.999(在上面的示例中,它是 1,如“BEGIN 1”和“Hello World: 1”)。
如前所述,这工作正常,服务器收到了所有 100.000 条消息,但是一旦所有消息都被传输,读取处理程序将被调用多次,尽管没有从客户端发送数据。
从 streambuf 对象中读取数据会产生旧消息的残余,如:
IN 61868,test\n
Hello World: 61868
\n=END\n
Và:
=END\n
=END\n
奇怪的是,它似乎只有在消息数量超过一定数量时才会发生,但它并不一致,让我相信某处发生了一些溢出或 UB,因此我显然已经做了一些事情错了,但我似乎无法弄清楚是什么。读取代码为:
typedef boost::shared_ptr asio_streambuf_ptr;
typedef boost::shared_ptr asio_socket_ptr;
...
void on_read(const asio_socket_ptr& s, const asio_streambuf_ptr& b,
const boost_error_code& e, size_t length) {
if ( !e ) {
std::string temp(boost::asio::buffer_cast(b->data()), length);
//process temp
b->consume(length);
} khác {
//Handle the error - or close the socket if disconnected
handle_error(s, e);
}
read(s, b);
}
void read(const asio_socket_ptr& s, const asio_streambuf_ptr& buf) {
if (s->is_open()) {
boost::asio::async_read_until(*s, *buf, "\n=END\n",
boost::bind(on_read, s, buf, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
我的 on_read 函数的第一个实现使用 std::istream 和 std::getline 逐行读取每条消息,但问题也存在于那里,并且由于很难在 gdb 中检查流,我重写了它以便于查看。
现在我必须强调我是 boost-asio 的新手,这是我第一次尝试用 boost 的那部分做一些有用的东西,因此我承认我很可能误解了 boost-asio 的几个概念异步io系统。
所以我的问题是:有没有人以前经历过这种情况或对我做错了什么有任何建议?
我已经制作了一个 SSCCE,但由于它涉及相当多的代码作为服务器和客户端,我想我会等到有人请求它时再将它发布到这里。
làm mới:问题似乎是客户端写入消息的速度比服务器读取消息的速度快。节流客户端稍微解决了这个问题。注意:更改内部缓冲区大小没有帮助,因此客户端似乎淹没了一些操作系统网络缓冲区或类似的东西。
1 Câu trả lời
如果出现错误,您不应该继续阅读 -> 只有在未检测到错误时才继续阅读。也许你在 EOF 之后继续阅读?将对 read 的调用移至 if 中的 read 函数中。
关于c++ - 从客户端收到所有数据后提升 asio streambuf 垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756194/
我有一个静态类。 static class AppDirectory { public static string PACSTEMP = Path.Combine(Path.GetTempPa
我已经设置了一个启用了推送通知的 iOS 应用。 我可以将消息推送到应用程序,例如角标(Badge)计数工作并相应更新。 但我从未在锁屏或其他地方看到标准的推送通知弹出窗口,但手机会振动,因此消息会通
我们有一个带有 Web 应用程序和一堆 Windows 服务的系统,它们在做一些后台工作。 每当我们需要对系统进行更实质性的更改时,我们最终不得不发出 IIS 重置,然后手动重新启动所有相关的 Win
我有以下几行 John SMith: A Pedro Smith: B Jonathan B: A John B: B Luis Diaz: A Scarlet Diaz: B 我需要获得所有获得
我正在编写一个 Java 客户端(在 weblogic 10.3 上)来调用一个安全的网络服务。我已获得安装在 cacerts、DemoIdentity.jks 和 DemoTrust,jks 中的客
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试调用void方法addToList,该方法将通过用户传递给它的两个字符串除外。我检查了dataSource类,以确保它确实接受了那些作为参数。问题是我在该方法调用上始终收到标识符>预期错误,
我的任务:使用scanner方法从一行数据中提取字符串、 float 和整数。 数据格式为: Random String, 240.5 51603 Another String, 41.6 59087
这个问题已经有答案了: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (25 个回答)
首先我实例化一个游戏状态 class GameState extends state{ ArrayList levels; int currentLevelID; public GameState()
Đã đóng. Vấn đề này không thể tái hiện hoặc do lỗi đánh máy. Hiện tại không chấp nhận câu trả lời. Sự cố này xảy ra do lỗi đánh máy hoặc một vấn đề không thể tái hiện được nữa. Mặc dù những câu hỏi tương tự có thể nằm trong chủ đề
我有一个实现为单例的 Controller 对象,它有一个可以随时驱逐对象的缓存。当一个对象即将被删除时,我想通知任何使用此 Controller 的类,以便它们能够做出适当的响应。我对这种行为的第一
因此,我尝试跨集群发送消息,该消息将包含一个 User 对象,该对象是一个可序列化类。 当我发送 String 或 int 时,它工作正常,消息发送没有问题,并且集群上的所有 channel 都收到它
我试图创建的程序是一个基本游戏,用户输入网格大小,选择 block 接收增加分数的奖品、从分数中夺走分数的强盗或结束游戏的炸弹。我收到堆栈流错误,但我不明白为什么? 抱歉,代码量很大,我只是无法找到问
使用此代码我会得到什么ConcurrentModificationException?我有一个同步(监听器)锁。 private void notifyListeners(MediumRenditio
我想在捕获 DeadlineExceededError 后正确退出。我还剩下多少钱来清理? 例如, try: do_some_work() except DeadlineExceededError
我有 2 个 Intranet 站点: http://intranetv1/ http://intranetv2/ v1基于.NET 1.1,v2基于.NET 3.5 在 v1 上,我创建了一个网页,
我有一个在 Linux 3.12 上运行的 C 程序。该程序产生几个子进程。其中一个进程会生成一个线程,该线程运行一段时间然后终止。当该子进程运行时,它会执行 epoll_wait()。 epoll_
我能够将 APNS 集成到我的应用程序中。现在我想在用户点击它或用户在使用应用程序时收到通知时处理通知。我使用下面的代码在收到通知时显示警报对话框: func application(applicat
当我试图在浏览器上运行这段代码时,出现了以下错误。"错误响应错误代码:501消息:不支持的方法(“POST”)。错误码解释:501-服务器不支持该操作。" 浏览器控制台出现以下错误: "1.加载资源失
Tôi là một lập trình viên xuất sắc, rất giỏi!