boost::asio を使用して同期 tcp クライアントを実装したい。
シナリオ:
- クライアント: tcp クライアントを同期し、ループでサーバーにデータを送信します
- サーバー: クライアントからデータを取得します
また、ソケットが使用できない場合は、接続を再構築できます。
クライアント
io_service ios;
shared_ptr<socket> sp_sock(new socket(ios));
endpoint ep(address,port);
error_code ec;
sp_sock->connect(ep,ec);
if(ec)
{
return;
}
for(;;)
{
error_code ec;
boost::asio::write(*sp_sock,buffer("hello world"),ec);
if(ec)
{
reconnect_socket();
}
cout<<ec.message()<<endl;
sleep_for_a_while();
}
問題
クライアントはサーバーに接続し、「hello world」をサーバーに送信します。しかし、「ctrl + c」でサーバーをシャットダウンすると、問題が発生します:
書き込み操作は、エラーがスローされることなく引き続き機能しますec.message() = "success"
。いくつかの書き込み操作の後、スレッドは書き込み時に永久にブロックされます。
おそらく、書き込み関数はデータをバッファに入れ、すぐに戻り、バッファがいっぱいになると書き込みがブロックされますか?
一般に、ソケットが書き込み可能かどうかを確認する方法、またはサーバーがダウンしたときにエラーをスローして、サーバーが再び起動したときにプログラムが接続を再構築できるようにする方法。