boost::asio::ip::tcp::socket 不读取任何内容
boost::asio::ip::tcp::socket doesn't read anything
这实际上是我的第一个套接字编程程序,除了复制粘贴教程代码和玩得开心。无论如何它不起作用。我想我已经仔细阅读了文档,但也许还不够。我怀疑我在read_message()
中使用了socket::read_some()
,因为我有问题的程序停在阅读部分。我认为我使用它的方式应该没问题,因为socket::read_some()
的文档指出"函数调用将阻塞,直到成功读取一个或多个字节的数据,或者直到发生错误。下面是我的代码。任何帮助表示赞赏。
void read_message(std::string& message, boost::asio::ip::tcp::socket& socket)
{
std::stringstream message_stream;
while (true)
{
std::array<char, 128> buffer;
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buffer), error);
if (error == boost::asio::error::eof)
{
break;
}
message_stream.write(buffer.data(), len);
}
message = message_stream.str();
}
服务器.cpp
int main()
{
while (true)
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(
boost::asio::ip::tcp::v4(), 9999));
boost::asio::ip::tcp::socket socket(io_service);
acceptor.accept(socket);
std::cout << "connected with client, waiting for a messagen";
std::string message;
read_message(message, socket);
boost::asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();
std::cout << "message received from " << endpoint.address().to_string() <<
':' << endpoint.port() << 'n' << message << 'n';
boost::asio::write(socket, boost::asio::buffer(message));
if (message.compare("quit") == 0)
{
break;
}
}
return EXIT_SUCCESS;
}
客户端.cpp
int main()
{
while (true)
{
std::cout << "your message to be sent: ";
std::string message;
std::getline(std::cin, message);
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query("localhost", "9999");
boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
boost::asio::ip::tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
std::cout << "connected to servern";
boost::asio::write(socket, boost::asio::buffer(message));
read_message(message, socket);
std::cout << "message received from server: " << message << 'n';
if (message.compare("quit") == 0)
{
break;
}
}
return EXIT_SUCCESS;
}
问题出在read_message
函数中:您读取直到eof
,但只有在套接字关闭时才会eof
。
也许你的意思是在遇到一些分隔符时从read_message
回来,例如。''?然后,您可以手动检查缓冲区,也可以使用read_until
函数。
使用read_until
函数,read_message
看起来像这样:
void read_message(std::string& message, boost::asio::ip::tcp::socket& socket)
{
std::stringstream message_stream;
boost::asio::streambuf buffer;
boost::system::error_code error;
size_t len = read_until(socket, buffer, 'n', error);
if (len)
{
message_stream.write(boost::asio::buffer_cast<const char *>(buffer.data()), len);
message = message_stream.str();
}
}
请记住将""附加到从客户端发送的消息中:
//...
std::cout << "connected to servern";
boost::asio::write(socket, boost::asio::buffer(message + 'n'));
read_message(message, socket);
//...
相关文章:
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- 为什么ifstream没有读取任何内容
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- C++使用用户名/SID 或备用读取任何窗口用户 HKEY
- C++ 中是否有任何内置阶乘函数?
- 无法使用 QSerialPort 读取任何内容
- 读取任何与PC兼容的赛车方向盘输入
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 套接字记录未读取任何消息
- 在 C++ 中立即设置故障位(在读取任何字节之前)
- 我需要在C /C#中使用图形.我可以使用任何内置的C /C#库
- 是否有任何内置类可以处理C 中的大整数值
- 文件I/O没有读取任何内容
- c ++中是否有任何内置功能可以在计划的时间运行任务
- 是否有任何内置的 UTF 在 c++ 在窗口中
- 逐字节读取任何文件(不是.bin文件)
- C++ std::istream readsome不读取任何内容
- boost::asio::ip::tcp::socket 不读取任何内容
- basic_ifstream<...>::read() 不读取任何内容
- 在VC++2010中执行任何内置的ARRAY函数