2016-11-03 21 views
1

asioソケットでno_delayオプションを設定する際に問題が発生しています。遅延を除いて、次のコードは正常に実行されます。私のサーバーは、5000ミリ秒が経過した後にのみメッセージを受信します。ASIO no_delayオプションを設定する

#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
using namespace boost::asio; 
struct Client 
{ 
    io_service svc; 
    ip::tcp::socket sock; 

    Client() : svc(), sock(svc) 
    { 
     ip::tcp::resolver resolver(svc); 
     ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query("127.0.0.1", "32323")); 
     connect(sock, endpoint); 
    } 

    void send(std::string const& message) { 
     sock.send(buffer(message)); 
    } 
}; 

int main() 
{ 
    Client client; 

    client.send("hello world\n"); 
    client.send("bye world\n"); 

    boost::this_thread::sleep_for(boost::chrono::milliseconds(5000)); 
} 

私はいくつかのオプションがあり遅延を追加しようとしています。接続する前にオプションを追加します)
1:

Client() : svc(), sock(svc) 
{ 
    ip::tcp::resolver resolver(svc); 
    ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query("127.0.0.1", "32323")); 

    sock.set_option(ip::tcp::no_delay(true)); 
    connect(sock, endpoint); 
} 

しかしこれはset_option: Bad file descriptor

2をスロー)の後にオプションを追加します。接続:

Client() : svc(), sock(svc) 
{ 
    ip::tcp::resolver resolver(svc); 
    ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query("127.0.0.1", "32323")); 

    connect(sock, endpoint); 
    sock.set_option(ip::tcp::no_delay(true)); 
} 

この場合でも、オプションは効果がなく、私はまだ遅延が見えます。 boost::asio with no_delay not possible?によれば、私はソケットを開いた後、ソケットを接続する前にオプションを設定する必要があります。だから私はこれを試しました:

Client() : svc(), sock(svc) 
{ 
    ip::tcp::endpoint endpoint(ip::address::from_string("127.0.0.1"), 32323); 
    sock.open(ip::tcp::v4()); 
    sock.set_option(ip::tcp::no_delay(true)); 
    sock.connect(endpoint); 
} 

しかし、私はまだ効果を参照してください。このオプションを設定するにはどうしたらいいですか?

編集:サーバー側で正しく設定していない可能性があります。これは完全なサーバーコードです:

#include <boost/asio.hpp> 
#include <iostream> 

int main() { 
    boost::asio::io_service  io_service; 
    boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 32323)); 
    boost::asio::ip::tcp::socket socket(io_service); 

    acceptor.accept(socket); 
    socket.set_option(boost::asio::ip::tcp::no_delay(true)); 

    boost::asio::streambuf sb; 
    boost::system::error_code ec; 
    while (boost::asio::read(socket, sb, ec)) { 
     std::cout << "received:\n" << &sb; 
    } 
} 
+0

サーバにも 'no_delay'オプションが設定されていますか? – Arunmu

+0

お返事ありがとうございます。私はサーバー側でそれを設定していませんでした。私は今、私はそれを設定していると思うが、まだ効果を見ていない。元の投稿を編集してサーバーコードを追加しました。 – Stewart

答えて

2

クライアントはip::tcp::no_delayオプションを適切に設定しています。しかしながら、観察されている遅延はこのオプションの結果ではありません。その代わりに、サーバーがクライアントが送信したデータよりも多くのデータを読み取ろうとした結果、クライアントがスリープして5000ms後に終了すると、サーバーの読み取り操作はエラーで完了します。

read()サーバによって開始された操作は、streambuf.max_size()バイトを読み取るか、エラーが発生したときに完了します。 streambufの最大サイズはデフォルトでstd::numeric_limits<std::size_t>::max()に設定され、constructorで設定できます。この場合、サーバはstd::numeric_limits<std::size_t>::max()バイトを読み込もうとしますが、クライアントは22バイトしか送信せず、5000msをスリープしてからソケットを閉じます。サーバーが接続をクローズしたことを確認すると、read()の操作は完了し、22バイトの読み取りとエラーコードboost::asio::error::eofが完了します。

+0

これは非常に意味があります。私は[Boostのチャットクライアントの例](http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/example/cpp03/chat/chat_client.cpp)を読んでいましたが、なぜ彼らはデータの最初のバイトにバッファサイズを送ったのですか?これはそれを説明します。情報をありがとう。 – Stewart

関連する問題