2

誰かが分を持っているなら、私は少し助けが必要です。IO完了ポートを使用してWebサーバーを作成しましたが、大きなファイルを送信するのに問題があります。Webページは正常にロードされているように見えますが、大きなファイル転送中に、WSASend()は数分後に失敗し、「指定されたネットワーク名は使用できなくなりました」というエラーが表示されます。

現在、重複する操作が失敗すると、サーバーは関連付けられた接続を閉じるだけです。これは正しいことですか?または、ソケットを閉じる前に、失敗した重複操作を数回再試行する必要がありますか?私はtcp/streamソケットを使用しています。

(修正済み)WSARecvからランダムな0バイトパケットのように見えるものも受信しています。これをどうすればいいのか、問題が関連しているかどうかわかりません。(/修正済み)

助けてくれてありがとう

編集:サーバーが接続を適切に処理し、はるかに包括的なログを持っているので、Lenは正しいようです。クライアントが何らかの理由で接続を閉じています。

ログ:

Initializing Windows Sockets...
Forwarding port 80...
Starting server...
Waiting for incoming connections...
Socket 1128: Client connected.
Socket 1128: Request received
Socket 1128: Sent response
Socket 1128: Error 64: SendChunk() failed. //WSASend()
Socket 1128: Closing connection - GetQueueCompletionStatus == FALSE

問題は、なぜクライアントが接続を閉じるのかということです。発生するまでに2〜5分かかります。バッファサイズを送信ごとに4098バイトに減らし、最初のチャンクが完了したときにのみ次のチャンクを送信します。

これについてのアイデアをありがとう。

ps再試行機能を実装しただけでも、失敗した重複IO操作を5回再試行してから、あきらめます....それでも運がない=(

4

3 に答える 3

4

から返された長さゼロのパケットはrecv、相手側のクライアントが接続を閉じたことを示します。クライアント
に続いて失敗した理由はどれですか。send

http://www.opengroup.org/onlinepubs/009695399/functions/recv.html

受信可能なメッセージがなく、ピアが正常なシャットダウンを実行した場合、recv() は 0 を返します。

于 2010-09-18T03:56:12.010 に答える
2

データ転送に何らかの形でフロー制御を課すために何かをしていますか?

そうでない場合は、送信が失敗する原因となっているリソースを使い果たしている可能性があります。

たとえば、WSASend()完了したタイミングに基づいてペーシングするのではなく、単純に大量の呼び出しを次々に発行する場合、それぞれがシステム リソース (非ページ プールおよび/または「ロックされたページの制限」に向かうロック ページ) を使用します。 )。その後、最終的にENOBUFSまたは同様のエラーで失敗する可能性があります。

あなたがする必要があるのは、一度に既知の数の送信のみが未処理になるように、送信完了に基づいて機能するフロー制御システムを構築することです。

詳細については、次の質問を参照してください。

TCP で優れたパフォーマンスの「送信」キューを実装する

「送信予定」キューによる TCP 送信の制限とその他の設計上の問題

于 2010-09-18T06:59:29.760 に答える
0

最後にそれを理解しました。

Rogers Internet サービス利用規約より:

制限なく、以下の目的で当社のサービスを使用する (または他の人に使用を許可する) ことはできません。

(xvi) メール、ニュース、ファイル、gopher、telnet、チャット、Web、またはホスト構成サーバー、マルチメディア >ストリーマー、またはマルチユーザーの対話型フォーラムを含むがこれらに限定されない、サービスに関連するサーバーを運用する。

それはどれほど不自由ですか?O_o

良いニュース: サーバーは正常に動作します =)

編集 - ロジャースと呼ばれます。彼らは私を切り離していることを確認し、Web サーバーを実行するにはビジネス アカウントが必要だと言いました。

于 2010-09-20T23:24:59.060 に答える