TCP를 통한 네트워크 스트림이 두 가지 방법 (클라이언트에서 서버로, 클라이언트에서 서버로)으로 Zlib
스트림입니다.NetworkStream을 통해 ZlibStream에서 읽음으로써 C# .Net에서 블로킹 문제가 발생합니다.
Zlib
의 경우 최신 Ionic.Zlib.dll
을 사용하고 있습니다.
송수신되는 첫 번째 몇 패킷의 경우 제대로 작동하지만 3 번째 패킷을 받으면 오작동합니다.
패킷이 반대쪽 끝까지 반복 될 때까지 ZlibStream
블록에서 모든 읽기 작업이 수행됩니다. 예를 들어
: 그 후 코드
// Where reader is a BinaryReader on the ZlibStream on the NetworkStream
int a = reader.ReadInt32(); // blocks until initial packet that is 12 bytes is received
int b = reader.ReadInt32(); // blocks until the packet is repeated
int c = reader.ReadInt32(); // blocks until the packet is repeated again
은 패킷이 실제로 3 회 전송 된 번만 받았다.
왜 차단합니까? 예상대로 차단하지 않고 계속 진행하려면 어떻게해야합니까?
Zlib에서 비워도 아무런 관련이 없습니까? (스트림은 모든 패킷 뒤에 플러시됩니다.)
그것은 당신의 게시하면 도움을 줄 : 데이터가 psuedocode에서 ... 그것을 압축 해제 버퍼에있을 때 나는, 네트워크 스트림로부터 데이터를 읽어 그것을 버퍼, 그리고 다른 방법 불이있을 것이다 더 많은 코드. 여기에서 차단 읽기를 사용하고 있습니다. 코드를 리팩토링하여 비동기/대기 패턴과 비동기 읽기 (예 : ReadInt32Async)를 사용하도록하십시오. – Noseratio
비동기 적으로 읽기가 내 문제를 해결하지 못합니다. – Codecat
나는 양쪽 모두 읽고 쓰기를 의미 했으므로 아무 블록도 없다. – Noseratio