初めまして。
asioでクライアントサーバーシステムを構築しようと思い、いろいろやってみましたがうまくいきません
〜以下コード(クライアント側)〜
ip::address addr=ip::address::from_string("192.168.1.12");
tcp::iostream s(tcp::endpoint(addr, 10800));
while(mred==0)
{
s << "allow";
s<<send<<flush;
s.close();
mred=1;
}
while(mred==1)
{
getline(s, line);
{
cout << line << recv << endl;
}
}
〜以下コード(サーバー側)〜
ip::tcp::acceptor acc(io, ip::tcp::endpoint(ip::tcp::v4(), 10800));
for (;;)
{
// 接続待ち
ip::tcp::iostream s;
acc.accept(*s.rdbuf());
while (getline(s, line))
{
cout << line << endl;
}
s <<"123";
s <<flush;
s<<send<<endl;
}
〜終了〜
症状的には
1.サーバーには届いている模様。
2.ただし文字がallowだけでなく色々付与されている。
3.クライアント側には帰ってこない。
……となっています。
グーグルさん等に聞いて試行錯誤したのですがよくわからないですし、可也困っているので宜しくお願いします。
>s.close();
サーバからの応答を待つ前にコネクションをクローズしちゃったら
サーバからのデータを受信できないんじゃないでしょうか。
s.close()をコメントアウトしてみたらどうですか?
きまぐれさん>クローズしないとサーバー側で受け取ってもらえないようなので、一旦クローズして……という感じでやってみたのですが、多分別の方法で送信終了を伝えないといけないんだろうなぁとは思ってます。
何か根本的な部分が違う気がするんだけど送れてはいるんだよなぁ……。
getlineという名前からして改行を待っているのではないでしょうか。
送信するときに改行を追加してみては?
これって動きますか?
http://d.hatena.ne.jp/faith_and_brave/20080402/1207105286
修正してみました
クライアント側
std::string line;
ip::address addr=ip::address::from_string("192.168.1.12");
tcp::iostream s(tcp::endpoint(addr, 10800));
s << "allow\n";
s << flush;
while(getline(s, line))
{
cout << line << endl;
}
サーバ側
io_service io;
std::string line;
ip::tcp::acceptor acc(io, ip::tcp::endpoint(ip::tcp::v4(), 10800));
for (;;)
{
// 接続待ち
ip::tcp::iostream s;
acc.accept(*s.rdbuf());
getline(s, line);
cout << line << endl;
s << "123\n";
s << flush;
} // ここでサーバ側のsはcloseされるのでクラインとの通信が切れる。
VC9で動作確認済みです。
>クラインとの通信が切れる
誤字った「クライアントとの通信が切れる」です。
えっと、以下のものにも解答しといたほうが良いかなと思ったので追記します。
>1.サーバーには届いている模様。
flushの時点でサーバには送信されます。
>2.ただし文字がallowだけでなく色々付与されている。
s << send
と書かれていますがこれはsend関数のアドレスが送信されています。
故にallow719E4C27等といった表示になっているんだと思います。
>3.クライアント側には帰ってこない。
これはきまぐれさんが言うとおりでs.close()を呼んでいるからです。
それとfukuさんが言うとおりでgetline()は改行が読まれるまで呼び出しから戻りません。
送信したいデータの区切りで改行(\n)を書いてflushして下さい。
ありがとうございます。
改行にそういった意味があることは気づかなかったので、良い勉強になりました。
構築も出来ましたしこれで一安心です。
解決チェックし忘れたので再送
ツイート | ![]() |