まず最初に、私は 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;
最後に を追加するという唯一の例外を除いて、クライアント側は変更されていません\n
。ただし、これにより多くのEnd of file
例外が発生します。