2012-03-21 5 views
2

私はNetworkStream.BeginRead/EndReadをソケットからの非同期読み込みに使用しています。NetworkStream.EndReadが0バイトを返した後でもまだデータを受信して​​いますか?

しかし、NetworkStream.EndRead()はソケットが閉じられていると思っていたが、時々BeginRead()を呼び出し続けると0が返されますより多くのデータを受け取る。

これは、ソケット/ NetworkStreamからのデータを連続的に読み取るための適切なループではありませんか?

void BeginContinousRead() 
{ 
    // Start the continous async read 
    mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null); 
} 

private void ProcessNetworkStreamRead(IAsyncResult result) 
{ 
    // This will sometimes be zero?! 
    int bytesRead = mStream.EndRead(result); 

    // Continue reading more data and call this callback method again over and over, etc. 
    mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null); 
} 

は、MSDNによると、私はより多くのデータがソケットで利用可能であるかどうかを判断するためにNetworkStream.DataAvailableプロパティを使用する必要がありますが、より多くのデータが後日届く可能性があるにもかかわらず、これはFALSEになります。

private void ProcessNetworkStreamRead(IAsyncResult result) 
{ 
    // This will sometimes be zero?! 
    int bytesRead = mStream.EndRead(result); 

    while (mStream.DataAvailable) 
    mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null); 
} 

...しかしDataAvailableはFALSEになりませんし、その後、私の連続読み取りが停止し、決してそれ以上のデータを読み込むため、これは正しく動作しません:

たとえば、MSDNによると、これは私のコールバックする必要があります。

もう一方の端は、ソケットを閉じるか、私はソケットをクローズすることを選択するまで、データ読み出しを継続するための正しい非同期のアプローチは何ですか?

答えて

0

ソケットが閉じているかどうかを確認するためにbytesReadまたはDataAvailableプロパティをチェックする代わりに、BeginReadへの呼び出しをラップしてIOExceptionをキャッチします。そうすれば、ソケットが閉じているかどうかを知ることができます。

+0

ありがとうございます - その後、適切なループは何ですか? BeginRead()を呼び出してEndRead()に0バイトを何度も何度も返すようにしますか? – SofaKng

+2

私はちょうど私のリスニングソケットにtelnetingでこれをテストしました。そして、何らかの理由で、私がtelnetクライアントを切断しても例外がスローされることはありません... – SofaKng

関連する問題