... | ... | @@ -663,6 +663,10 @@ class LambdaScope |
|
|
11. **stread.Read 메소드를 while 루프로 여러번 읽는 이유는? (TCP stream 이야기)**
|
|
|
TCP는 분리된 메시지를 보내는 것이 아니라, 데이터를 바이트 스트림의 형태로 나눠서 보내기 때문에, 각각의 읽기에서 얼마나 많이 읽혀졌는지를 예측할 수 없다. 그래서 받으려 하는 길이가 0이 될때까지 반복해서 받아야한다.
|
|
|
|
|
|
TCP 통신에서 한 번에 보낼 수 있는 데이터의 양은 정해져있다. 송신속도가 수신속도보다 빠르면 packet drop이 발생해 데이터가 손실될 수 있기 때문에 한 번에 보낼 수 있는 양을 제한해서 여러번 보내는 방식을 취한다. 이를 Flow Control(흐름 제어)라고 한다. 어플리케이션에서 Read 시스템 콜을 호출하면 , 커널 영역의 receive socket buffer에 있는 데이터를 유저 공간의 메모리로 복사하고, 복사한 데이터는 버퍼에서 지운다. 그러면 다시 TCP는 receive window를 증가시키고 ACK 메세지를 보낸다.
|
|
|
|
|
|
원하는 길이만큼 데이터를 받을때까지 위 과정을 반복해야하기 때문에, while 루프로 remainLength 만큼 read했는지 체크하며 반복하는 것이다.
|
|
|
|
|
|
**TCP/IP의 특성**
|
|
|
|
|
|
1. Connection oriented
|
... | ... | @@ -732,8 +736,9 @@ TCP는 분리된 메시지를 보내는 것이 아니라, 데이터를 바이트 |
|
|
12. **LINQ 결과인 IEnumerable<T>를 for 문으로 루프 돌때, breakpoint 걸어서 확인해보기**
|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
for each의 in이 실행될 때, 위의 Where문의 조건이 참, 거짓인지를 리턴하는 익명 메서드가 호출된다. 해당 요소가 조건에 맞는지 검사해서 참이면 all.Current에 그 요소가 들어가고 아니면 건너뛴다. Current의 요소는 item에 전달되어 정상적으로 출력된다.
|
|
|
for each의 in이 실행될 때, 위의 Where문의 조건이 참, 거짓인지를 리턴하는 익명 메서드가 호출된다. 해당 요소가 조건에 맞는지 검사해서 참이면 all.Current에 그 요소가 저장되고 아니면 건너뛴다. Current에 저장된 요소는 item로 전달되어 정상적으로 출력된다.
|
|
|
|
|
|
|
|
|
|
... | ... | |