2017-12-09 16 views
1

だから私のセットアップは以下の通りです:C++ライブラリブーストASIOとTCPサーバとして働いてブースト:: ASIO :: STDとasync_write ::文字列

  • ラズベリーパイ。
  • TCPクライアントは他のマシンで実行しています。

クライアントからのリクエストに回答する必要があると思われる部分については、通信が正常に動作しています。私は、次のコードを使用しています実行します。

std::cout << "\tI2C message from Arduino: " << I2CrxBuf_; 
boost::asio::async_write(sock_, boost::asio::buffer(I2CrxBuf_.c_str(), sizeof(I2CrxBuf_.c_str())), boost::bind(&conn::h_write, shared_from_this())); 
std::cout << "Passei o async_write" << std::endl; 

事は、そのメッセージが印刷だけで結構ですが、それはクライアントにメッセージを送信せずに、最後の印刷にジャンプし、そのクライアントをブロックします。

I2C message from Arduino: l 1 14.88 
Passei o async_write 

は、私はこのような一般的なメッセージを送信する場合::それは予想されたよう

boost::asio::async_write(sock_, boost::asio::buffer("Message recevied\n"), boost::bind(&conn::h_write, shared_from_this())); 

クライアントがメッセージを受信

サーバーでの出力は次のようです。

私は文字列をchar *に変換する方法と関係がありますが、それを動作させる方法を見つけることはできません。

+1

'sizeof(I2CrxBuf_.c_str())'は4バイトです。私はあなたが 'I2CrxBuf_.size()'を意味したと思います。 – arrowd

+0

ありがとう、実際にはまだ送信していません... –

+0

また、私はチェックして、c.str()メソッドは文字列の最後から '\ n'を削除しません。 クライアントにはメッセージが必要なので、これは問題ではありません。 –

答えて

1

sizeof(I2CrxBuf_.c_str())が間違っています。また、buffer(I2CrxBuf)を直接行うこともできます。その他の過負荷については、docsを参照してください。それ以外

、文字列ニーズは、非同期操作の終わりまで生き続けるために(と平均時間で変更することができない)ことを実現します。

ドキュメントのすべてのサンプルには、これを達成するための良いアイデアがあります。

+0

タクス!私はミューテックスがそれが変更されていないことを確認している...しかし、とにかく警告のおかげで! –

+1

ミューテックスは、非同期設定では本当に動作しません。もちろん、あなたがフープを飛び越える場合、すべてのハンドラが特定のスレッド上で実行されていることを確認してください。長い間mutexをロックしたままにしてください(これらはすべてデザインの匂いです) - 私たちは90%欠陥がある。あなたはどのように文字列を生かしていますか?データ/リソースの同期については、[Asio Strands](http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/overview/core/strands.html)をご覧ください。 – sehe

+0

申し訳ありませんが、この場合私はcondition_variableを使用しています...彼らは仕事を正しく行うべきですか? –

関連する問題