2012-03-21 2 views
2

소켓에서 비동기 읽기를 위해 NetworkStream.BeginRead/EndRead를 사용하고 있습니다.NetworkStream.EndRead가 0 바이트를 반환 한 후에도 데이터를받는 이유는 무엇입니까?

그러나 NetworkStream.EndRead()는 때로는 0을 반환합니다 (소켓에서 0 바이트를 읽음). 소켓이 닫혔다 고 생각했지만 실제로는 BeginRead()를 계속 호출하면 true입니다. 더 많은 데이터를받습니다.

소켓/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 될 것입니다.

이 내 콜백해야 MSDN에 따라 예를 들어

:

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가되고 다음 내 연속이 정지를 읽고 결코 더 이상 데이터를 읽고 없기 때문에이 제대로 작동하지 않습니다.

다른 끝에서 소켓을 닫거나 소켓을 닫을 때까지 데이터를 계속 읽는 올바른 비동기 방식은 무엇입니까?

답변

0

bytesRead 또는 DataAvailable 속성을 검사하여 소켓이 닫혀 있는지 확인하는 대신 BeginRead에 대한 호출을 랩하고 IOException을 catch하십시오. 그러면 소켓이 닫혔는지 알려줄 것입니다.

+0

감사합니다. 그러면 올바른 루프는 무엇이 될까요? BeginRead()를 계속 호출하고 EndRead()가 0 바이트를 반복해서 반환하도록 하시겠습니까? – SofaKng

+2

필자는 청취 소켓에 telneting으로 테스트 한 결과, 텔넷 클라이언트를 연결 해제 한 후에도 예외가 발생하지 않습니다. – SofaKng

관련 문제