0


0

私はboost

asioを使ってCで基本的なHTTPサーバーを実装しています。

各要求を処理するときに、データをチャンクで非同期に書き出します。 クライアントが接続されなくなったことがわかった場合はいつでも処理を中止します。 クライアントが存在しなくなった場合に送信するために結果を構築し続ける意味はありません。

私はこれがすでにここで数回質問されていると思います。

https://stackoverflow.com/questions/685951/how-can-i-check-if-a-client-disconnected-through-winsock-in-c[クライアントがCのWinsockから切断されたかどうかを確認する方法はありますか

しかし私はそれらを読んでいます私はまだここで良いアプローチが何であるかわからない。

  • クライアントソケットから読み込もうとすることはできますか? (相手方のHTTPクライアントがデータを送信しないことを知っていても)

  • (boost :: asio :: async_writeを使って)非同期的に書いているので、クライアントがいなくなってもフィードバックは得られないようです。

2 Answer


1


クライアントが切断した場合は、非同期書き込みが適切なエラーコードで失敗します。 完了ハンドラがエラーで呼び出されたときは、処理を中止します。


0


考慮すべき3つのことがあります(ただし、これはboostを使用して行われていますが、わかりません)。

  • クライアントからのクリーンシャットダウンを検出します。 これはクライアントからのread()によって行われます。 0を返すreadは相手が接続を閉じたことを意味します。httpパイプラインを実装している場合はとにかくクライアントから読み続ける必要があるでしょう。

  • クライアントの不正なシャットダウンを検出すると、write()は最終的に失敗し、read()も同様にエラーになります。

それからその間にクライアントが消えるか、または悪意を持って遅いリーダー/ライターであるケースがあります。

  • タイムアウト しばらく活動がない場合は、接続を捨てる必要があります。 これはあなたがクライアントに何かを書くことにも当てはまります。 タイムアウトを実装していないネットワークの読み書きは、とにかくひどく壊れてしまい、リソースをリークすることになります(ユーザーがノートブックを閉じ、ケーブルを引っ張り、NATゲートウェイが静かにtcp接続を捨てる、悪意のあるユーザーが読んでブロックしないTCP転送など) 非同期書き込みプロセスを制御できない場合は、ここで問題が発生します。