![](/img/trans.png)
[英]Can't implement boost::asio::ssl::stream<boost::asio::ip::tcp::socket> reconnect to server
[英]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();
}
server.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 message\n";
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;
}
client.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 server\n";
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
返回,例如。 '\\ N'? 然后,您可以手動檢查緩沖區,也可以使用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();
}
}
請記住在您從客戶端發送的消息后附加“ \\ n”:
//...
std::cout << "connected to server\n";
boost::asio::write(socket, boost::asio::buffer(message + '\n'));
read_message(message, socket);
//...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.