1

すべてのサイズのファイルを転送するために、VB.NETで単純なTCPクライアント/サーバーをコーディングしています。System.Net.SocketsのコマンドSendFileを使用して、ソケットを介してバイトを転送することにしました。

受信側では、バイトを取得するためのコードはかなりうまく機能しますが、転送がランダムに停止することがあります。

次のデータブロックの取得の間にわずかなスリープ遅延を設けることで、転送が100%安定することがわかりました。

(利用可能なデータがなくなるまで)データを取得するための私のコードは、次のように簡略化されています。

While newSocket.Available > 0
    Threading.Thread.Sleep(100)
    newSocket.ReceiveFrom(data, Remote)
End While

私はそのスリープ遅延を使用するのが本当に嫌いで、SendFileからデータを取得するための適切なメソッド/関数が必要だと思いますか?

4

1 に答える 1

1

Socket.Availableは、これまでに受信され、まだ読み取られていないバイトの総数を返します。したがって、データを受信するよりも速く読み取ると(低速のネットワークではかなり可能です)、クライアントがまだデータを送信している最中であっても、読み取るデータはありません。

クライアントが送信するファイルごとにサーバーに新しい接続を確立する場合は、次のように変更するだけです。

While newSocket.Connected
    If newSocket.Available > 0 Then
        newSocket.ReceiveFrom(data, Remote)
    End If
End While

ただし、代わりに、BeginReceiveなどの非同期呼び出しを使用することをお勧めします。次に、一定のループで待機するのではなく、処理するデータがあるとすぐにデリゲートが呼び出されます。例については、次のリンクを参照してください。

http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx

于 2012-06-08T15:16:50.640 に答える