2017-10-13 2 views
1

ReadTimeout의 사용 방법과 이것이 Read()에 미치는 영향에 대해 혼란 스럽습니다.NetworkStream : ReadTimeout 및 그 효과 Read()

,이 3 가지 시나리오가 있습니다 우리는 바이트의 X 번호를 읽으려는 가정 네트워크 스트림을 읽으려고 할 때 :

  1. 데이터, 사용할 수 있으며, < X
  2. 데이터를 사용할 수있는 바이트와 바이트 = X
  3. 데이터 가능, 바이트> X
  4. 가능한 데이터가 없으며, 사용 가능한 데이터가 없기 ReadTimeout> 0
  5. ReadTimeout = 0

문서는 약간 모호하며 명시 적으로 Read()에 대한 ReadTimeout 통화에서 언급하지 않는, 또는 ReadTimeout 여부를 전혀 Read() 호출에 영향을 미칩니다.

이 메서드는 데이터를 buffer 매개 변수로 읽어서 성공적으로 읽은 바이트 수를 반환합니다. 읽기에 사용할 수있는 데이터가 없으면 Read 메소드는 0을 반환합니다. 읽기 작업은 size 매개 변수로 지정된 바이트 수까지 사용할 수있는만큼의 데이터를 읽습니다.

은 내가 이해하는 것은 위의 5 가지 시나리오를위한 것입니다

  1. Read()은 X 바이트에서 읽고 즉시 반환됩니다. ReadTimeout은 X 바이트를 읽고
  2. Read()
  3. 은 X 바이트를 읽고 반환 반환
  4. Read()
  5. 을 중요하지 않습니다. 나머지 X 바이트를 읽으려면 다시 읽기를 호출해야합니다.
  6. Read() (으)로 전화하면 데이터 시간이 ReadTimeout 기다립니다.
  7. Read()는 사람이 약간의 설명을 줄 수 있다면 매우 감사겠습니까 0

즉시 반환합니다.

감사합니다.

+1

'Read()'는 데이터를 사용할 수 있거나 다른 쪽이 연결을 닫을 때까지 차단합니다. 나는이 문서가 "데이터를 읽을 수 없다면 Read 메서드는 0을 반환한다"는 말을 오해의 소지가 있다고 생각합니다. –

+2

[ReadTimeout] (https://msdn.microsoft.com/en-us/library/bk6w7hs8(v=vs.110) .aspx)의 설명서를 읽어야합니다. * "읽기 작업 시간 데이터를 기다리는 블록 "*.'Read()'는 실제로 버퍼에 복사하기에 충분한 데이터가 수신 될 때까지 호출자를 차단합니다. 오류가 있거나 ('0' 바이트가 생기지 않는 한) 시간 초과가 없다면 (당신이 물어 보는 것보다 적게). – Sinatr

+2

실제로'Read'가 타임 아웃을 던질 것이기 때문에 언제 돌아올지는 모르겠습니다. 차단 부분은 [올바른] (https://stackoverflow.com/a/6958290/1997232)입니다. – Sinatr

답변

1

source for NetworkStream을 보면 시나리오 1 - 4와 이해가 정확하다는 것을 알 수 있습니다. NetworkStream은 소켓에서 read()를 호출합니다. 만료 된 타임 아웃의 원인은 타임 아웃을 나타내는 내부 SocketException이있는 IOException입니다.

시나리오 5는 적용되지 않습니다. 0의 ReadTimeout은 존재할 수 없으며, -1 (-1, 무한 의미) 또는> = 1입니다. 5는 영원히 블록화됩니다. 또는, 에러를 나타내는 내부 SocketException를 가지는 IOException가 발생합니다.

+0

곤잘레스 고마워요! 이제는 의미가 있습니다. – madu