소켓에서 비동기 읽기를 위해 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가되고 다음 내 연속이 정지를 읽고 결코 더 이상 데이터를 읽고 없기 때문에이 제대로 작동하지 않습니다.
다른 끝에서 소켓을 닫거나 소켓을 닫을 때까지 데이터를 계속 읽는 올바른 비동기 방식은 무엇입니까?
감사합니다. 그러면 올바른 루프는 무엇이 될까요? BeginRead()를 계속 호출하고 EndRead()가 0 바이트를 반복해서 반환하도록 하시겠습니까? – SofaKng
필자는 청취 소켓에 telneting으로 테스트 한 결과, 텔넷 클라이언트를 연결 해제 한 후에도 예외가 발생하지 않습니다. – SofaKng