2

クライアントがファイルをサーバーに送信するとき、サーバーがデータをダウンロードして書き込むのに十分な時間を確保するために、次のチャンクを送信する前にスリープ (100) する必要がありますか?

それは完全に不必要に思えますか?

また、チャンクを送信するときに wouldblock エラー (# 10035) が発生するので、成功するまで送信をループするだけです。、 それは大丈夫ですか?

4

3 に答える 3

2

TCP経由でファイルを送信している場合、すべてが受信されたことを確認するのはプロトコルです。各チャンクの間にスリープを設定することはありません。

willblockエラーは、出力バッファに送信するデータが多すぎるか、送信する速度が速すぎてリモートバッファがいっぱいになることです。受信者がそれを受け取ったが、それを保存してちょうどそれを落とすのに十分なスペースがなかったので、それはそれを再び送るのに問題がないようです。

これがあなたのエラーについての小さな記事です:Winsockエラー10035

于 2012-04-27T09:54:47.483 に答える
2

私の意見では、スリープ機能を使用して何かが行われるのを待つことは、99% の確率で間違った方法です。プロセスが実行されるのに必要な時間、または期待する時間は決してありません (たとえば、スパイク、その他の i/o の問題などによって中断される可能性があります)。

重要な何かが完全に実行されるようにしたい場合は、セマフォなど、開始/終了時にプロセスをロック/解放する場所について読む必要があります。

于 2012-04-27T10:26:18.853 に答える
0

マンページから取得:

メッセージがソケットの送信バッファーに収まらない場合、send() は、ソケットが非ブロッキング I/O モードに設定されていない限り、通常はブロックされます。非ブロッキング モードでは、この場合、エラー EAGAIN または EWOULDBLOCK で失敗します。select(2)呼び出しを使用して、追加のデータをいつ送信できるかを判断できます。

于 2012-04-27T10:54:47.563 に答える