boost::asioでTCPクライアントサーバーの構築をしたいのですが……

解決


クロウ  2009-04-19 21:47:39  No: 70019

初めまして。

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.クライアント側には帰ってこない。

……となっています。

グーグルさん等に聞いて試行錯誤したのですがよくわからないですし、可也困っているので宜しくお願いします。


きまぐれ  2009-04-21 09:15:15  No: 70020

>s.close();
サーバからの応答を待つ前にコネクションをクローズしちゃったら
サーバからのデータを受信できないんじゃないでしょうか。
s.close()をコメントアウトしてみたらどうですか?


クロウ  2009-04-21 21:31:39  No: 70021

きまぐれさん>クローズしないとサーバー側で受け取ってもらえないようなので、一旦クローズして……という感じでやってみたのですが、多分別の方法で送信終了を伝えないといけないんだろうなぁとは思ってます。

何か根本的な部分が違う気がするんだけど送れてはいるんだよなぁ……。


fuku  2009-04-21 23:20:09  No: 70022

getlineという名前からして改行を待っているのではないでしょうか。
送信するときに改行を追加してみては?


よすむら  2009-04-22 02:02:06  No: 70023

これって動きますか?
http://d.hatena.ne.jp/faith_and_brave/20080402/1207105286


xyuyux  2009-04-22 06:59:19  No: 70024

修正してみました

クライアント側
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で動作確認済みです。


xyuyux  2009-04-22 07:00:21  No: 70025

>クラインとの通信が切れる
誤字った「クライアントとの通信が切れる」です。


xyuyux  2009-04-22 10:15:10  No: 70026

えっと、以下のものにも解答しといたほうが良いかなと思ったので追記します。
>1.サーバーには届いている模様。
flushの時点でサーバには送信されます。

>2.ただし文字がallowだけでなく色々付与されている。
s << send
と書かれていますがこれはsend関数のアドレスが送信されています。
故にallow719E4C27等といった表示になっているんだと思います。

>3.クライアント側には帰ってこない。
これはきまぐれさんが言うとおりでs.close()を呼んでいるからです。
それとfukuさんが言うとおりでgetline()は改行が読まれるまで呼び出しから戻りません。
送信したいデータの区切りで改行(\n)を書いてflushして下さい。


クロウ  2009-04-23 17:54:05  No: 70027

ありがとうございます。

改行にそういった意味があることは気づかなかったので、良い勉強になりました。

構築も出来ましたしこれで一安心です。


クロウ  2009-04-23 17:55:29  No: 70028

解決チェックし忘れたので再送


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加