- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我想声明我是 C++ 的初学者,并且总体上有所提升,尽管我确实有一些使用 Java 和 C# 等语言的经验。
也就是说,我在通过 Boost TCP 套接字传输数据时遇到了问题。我正在使用这段代码:
发送:
tcp::socket s(io_service);
boost::asio::connect(s, iterator);
string response = static_cast<ostringstream*>( &(ostringstream() << arg1) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg2) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg3) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg4) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg5) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg6) )->str();
//pad the rest
while (response.length() < max_length)
{
response += ' ';
}
boost::asio::write(s, boost::asio::buffer(response, sizeof(response)));
阅读:
tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port));
while(true)
{
socket_ptr sock(new tcp::socket(io_service));
a.accept(*sock);
boost::thread t(boost::bind(session, sock));
}
...
void session(socket_ptr sock)
{
char data[max_length];
size_t length;
try
{
while(true)
{
boost::system::error_code error;
//size_t length = sock->read_some(boost::asio::buffer(data), error);
length = boost::asio::read(*sock, boost::asio::buffer(data, sizeof data));
std::cout << "Length " << length << endl;
if (error == boost::asio::error::eof)
{
break; // Connection closed cleanly by peer.
}
else if (error)
{
throw boost::system::system_error(error); // Some other error.
}
}
}
catch (std::exception& e)
{
std::cout << data << endl;
string message = e.what();
if(std::string::npos != message.find(END_OF_FILE))
{
domeSomethingWithTheData(data);
memset(data, 0, sizeof data);
}
else
{
std::cout << data <<endl;
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}
}
我无法理解的是,无论我使用什么(boost::asio::read
或 sock->read_some
),我都不会获得超过 32 个字符的数据。我尝试将缓冲区的大小增加到 2048
, 但问题仍然存在。
缓冲区总是包含超过 32 个字符(其中大部分是垃圾),但我假设这些实际上不是从客户端发送的,而是来自服务器端自 std::cout << "Length " << length
以来缓冲区的实际分配。打印出 32。
任何有关我如何从客户端向服务器发送任意数量的字符的信息都将不胜感激。
编辑:
在 Rafal Rawicki 提供的指示之后,我现在正在使用此代码:
boost::asio::streambuf buffer;
boost::asio::read_until(*sock, buffer, '\n');
std::istream is(&buffer);
std::string line;
std::getline(is, line);
std::cout << line << std::endl;
客户端保持不变,唯一的异常(exception)是我添加了一个 \n
在最后。这会产生很多 End of file
但有异常(exception)。
最佳答案
这实际上不是您问题的答案。但有一个简短的建议。
你的字符串连接代码很残忍!
string response = static_cast<ostringstream*>( &(ostringstream() << arg1) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg2) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg3) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg4) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg5) )->str()
+ "," + static_cast<ostringstream*>( &(ostringstream() << arg6) )->str();
对于每个 arg,您创建一个新的 ostringstream
,将值写入其中,然后您不必要地取消引用它,然后您不必要地转换它无论如何,它已经拥有的类型。最后,您使用字符串连接来构建您的最终字符串。
这种字符串连接既不高效,也不复杂(需要临时对象、一些无用的分配等等)。
ostringstream
是字符串连接和格式化的正确工具,它高效而复杂。
长话短说,您的代码应该如下所示:
ostringstream oss;
oss << arg1 << "," << arg2 << "," << arg3 << "," << arg4 << "," << arg5 << "," << arg6;
string response = oss.str();
关于c++ - 升压套接字问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726244/
在 Java 中,我可以在不指定类型的情况下定义泛型类的变量。 class Tree> {} somewhere-else: Tree tree; 然后我可以从文件中读入一些对象并将其类型转换为我想要
我昨天发布了一个问题,我使用 multi_map 解决了这个问题: Having a composite key for hash map in c++ 这很有效,但是当数据足够大时就会出现问题。 我
这应该很简单(我只是在学习 boost,所以我错过了一些东西) 我已经使用 json_read 读取了一些简单的 JSON,现在有了一个 ptree。网络上的所有示例都显示使用 ptree.get("
所以我的问题很简单,在我的词法分析器类(扩展 lex::lexer )中,我有以下内容; this->self.add ... ("&&", AND_AND) ("||", O
关于这个问题有很多问题,但似乎没有一个能解决我的问题。我不认为这真的是一个 Boost::Variant 问题;我很确定我只是以错误的方式使用了模板。我能够剥离代码,以便您可以编译它并自己查看问题,这
这个问题确定不可复制类型不能与 Boost Variant 一起使用 树类 template class Tree{ private: class TreeNode{
我有一个用于解析标识符的解析器,如 foo, bar, baz 和一个用于解析嵌套标识符的解析器,如 foo::bar, foo::bar.baz, foo::bar.baz.baham它们都解析为相
通过阅读其他 Stack Overflow 条目和 boost::asio 文档,我确认没有同步 ASIO 读/写调用也提供易于使用的超时作为调用的参数。 我正在使用使用超时的 select(2) 调
我应该在我的 jamroot.jam 文件中放入什么,以便 libAPLibrary.so 与 MyProject 编译的结果相关联? root |-MyProject | |-jamroot
我有一个 vector,我想将其插入到一个 set 中。这是三个不同的调用之一(另外两个更复杂,涉及 boost::lambda::if_()),但解决这个简单的案例将帮助我解决其他问题。 std::
我确定套接字在我的应用程序中的任何地方都关闭了,并且我不断在我的/proc/pid/fd/下获取这个新创建的 fd/socket 文件,这是正常的。我确定不是。 connection.cpp con
元组是由括号括起来的逗号分隔列表,例如 () (,) (thing,) (2,3) 如果我有 #define ISTUPLE(x) \\... 我想要类似 ISTUPLE(nope) 的东西解析为 0
我有一个问题,两个线程是这样调用的,一个接一个。 new boost::thread( &SERVER::start_receive, this); new boost::thread( &SERVE
遇到 Boost 程序选项问题。我添加了一个多次使用选项,我们称之为“--opt”。当我从命令行使用两个“--opt”运行program.exe时,我从boost中收到以下错误。 terminatin
我想用类似于 C 的转义规则来解析字符串。我想保留转义,而不是解码它们然后重新编码。所以我认为 *(char_('\\') >> char_ | char_ - '"') 会做我想做的事,但事实并非如
聊天程序就是一个很好的例子。只需要一个可以接受来自客户端的多个连接的服务器,并且该服务器需要能够向各个客户端发送消息。 我计划将它变成一个分布式计算程序,以使用多个神经网络。 最佳答案 Asio是处理
我是一名优秀的程序员,十分优秀!