... | @@ -644,12 +644,12 @@ class LambdaScope |
... | @@ -644,12 +644,12 @@ class LambdaScope |
|
unsigned short htons(unsigned short); // 호스트 -> 네트워크 short
|
|
unsigned short htons(unsigned short); // 호스트 -> 네트워크 short
|
|
unsigned short ntohs(unsigned short); // 네트워크 -> 호스트 short
|
|
unsigned short ntohs(unsigned short); // 네트워크 -> 호스트 short
|
|
unsigned long htonl(unsigned long); // 호스트 -> 네트워크 long
|
|
unsigned long htonl(unsigned long); // 호스트 -> 네트워크 long
|
|
unsigned long ntohl(unsigned long); // 네트워크 -> 호스트 long
|
|
unsigned long ntohl(unsigned long); // 네트워크 -> 호스트 long
|
|
|
|
|
|
C#에서는
|
|
C#에서는
|
|
IPAddress.HostToNetworkOrder() 나 IPAddress.NetworkToHostOrder()를 쓰면 된다.
|
|
IPAddress.HostToNetworkOrder() 나 IPAddress.NetworkToHostOrder()를 쓰면 된다.
|
|
숫자 26을 바이트 배열로 만들때
|
|
숫자 26을 바이트 배열로 만들때
|
|
byte[] buffer = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(26));
|
|
byte[] buffer = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(26));
|
|
|
|
|
|
|
|
|
|
'h' : host byte order
|
|
'h' : host byte order
|
... | @@ -661,11 +661,10 @@ class LambdaScope |
... | @@ -661,11 +661,10 @@ class LambdaScope |
|
|
|
|
|
|
|
|
|
11. **stread.Read 메소드를 while 루프로 여러번 읽는 이유는? (TCP stream 이야기)**
|
|
11. **stread.Read 메소드를 while 루프로 여러번 읽는 이유는? (TCP stream 이야기)**
|
|
TCP는 분리된 메시지를 보내는 것이 아니라, 데이터를 바이트 스트림의 형태로 나눠서 보내기 때문에, 각각의 읽기에서 얼마나 많이 읽혀졌는지를 예측할 수 없다. 그래서 받으려 하는 길이가 0이 될때까지 반복해서 받아야한다.
|
|
|
|
|
|
|
|
TCP 통신에서 한 번에 보낼 수 있는 데이터의 양은 정해져있다. 송신속도가 수신속도보다 빠르면 packet drop이 발생해 데이터가 손실될 수 있기 때문에 한 번에 보낼 수 있는 양을 제한해서 여러번 보내는 방식을 취한다. 이를 Flow Control(흐름 제어)라고 한다. 어플리케이션에서 Read 시스템 콜을 호출하면 , 커널 영역의 receive socket buffer에 있는 데이터를 유저 공간의 메모리로 복사하고, 복사한 데이터는 버퍼에서 지운다. 그러면 다시 TCP는 receive window를 증가시키고 ACK 메세지를 보낸다.
|
|
TCP 통신에서 한 번에 보낼 수 있는 데이터의 양은 정해져있다. 송신속도가 수신속도보다 빠르면 packet drop이 발생해 데이터가 손실될 수 있기 때문에 한 번에 보낼 수 있는 양을 제한해서 여러번 보내는 방식을 취한다. 이를 Flow Control(흐름 제어)라고 한다. 어플리케이션에서 Read 시스템 콜을 호출하면 , 커널 영역의 receive socket buffer에 있는 데이터를 유저 공간의 메모리로 복사하고, 복사한 데이터는 버퍼에서 지운다. 그러면 다시 TCP는 receive window를 증가시키고 ACK 메세지를 보낸다.
|
|
|
|
|
|
원하는 길이만큼 데이터를 받을때까지 위 과정을 반복해야하기 때문에, while 루프로 remainLength 만큼 read했는지 체크하며 반복하는 것이다.
|
|
원하는 길이만큼 데이터를 받을때까지 위 과정을 반복해야하기 때문에, while 루프로 remainLength 만큼 read했는지 체크하며 반복하는 것이다.
|
|
|
|
|
|
**TCP/IP의 특성**
|
|
**TCP/IP의 특성**
|
|
|
|
|
... | @@ -731,14 +730,14 @@ TCP 통신에서 한 번에 보낼 수 있는 데이터의 양은 정해져있 |
... | @@ -731,14 +730,14 @@ TCP 통신에서 한 번에 보낼 수 있는 데이터의 양은 정해져있 |
|
TCP 레이어에서도 checksum을 확인해서 패킷이 올바른지 검사한다. 그 다음 TCB를 찾는다. TCB를 찾으면 프로토콜을 수행해서 받은 패킷을 처리한다. 데이터를 해당 TCB에 속한 소켓의 receive socket buffer에 추가한다. 그 후 TCP 상태에 따라서 새로운 TCP 패킷(ACK 등)을 전송할 수 있다. 이렇게 수신 패킷 처리 과정이 끝난다.
|
|
TCP 레이어에서도 checksum을 확인해서 패킷이 올바른지 검사한다. 그 다음 TCB를 찾는다. TCB를 찾으면 프로토콜을 수행해서 받은 패킷을 처리한다. 데이터를 해당 TCB에 속한 소켓의 receive socket buffer에 추가한다. 그 후 TCP 상태에 따라서 새로운 TCP 패킷(ACK 등)을 전송할 수 있다. 이렇게 수신 패킷 처리 과정이 끝난다.
|
|
|
|
|
|
이후 어플리케이션이 read 시스템 콜을 호출하면 커널 영역으로 전환되고, socket buffer에 있는 데이터를 유저 공간의 메모리로 복사해 간다. 복사가 끝나면 복사한 데이터는 socket buffer에서 제거하고 TCP를 호출한다. TCP는 socket buffer에 새로운 공간이 생겼기 때문에 receive window를 증가시킨다. 그리고 프로토콜 상태에 따라서 패킷을 전송한다.
|
|
이후 어플리케이션이 read 시스템 콜을 호출하면 커널 영역으로 전환되고, socket buffer에 있는 데이터를 유저 공간의 메모리로 복사해 간다. 복사가 끝나면 복사한 데이터는 socket buffer에서 제거하고 TCP를 호출한다. TCP는 socket buffer에 새로운 공간이 생겼기 때문에 receive window를 증가시킨다. 그리고 프로토콜 상태에 따라서 패킷을 전송한다.
|
|
<br />
|
|
<br />
|
|
|
|
|
|
12. **LINQ 결과인 IEnumerable<T>를 for 문으로 루프 돌때, breakpoint 걸어서 확인해보기**
|
|
12. **LINQ 결과인 IEnumerable<T>를 for 문으로 루프 돌때, breakpoint 걸어서 확인해보기**
|
|
|
|
|
|

|
|

|
|
|
|
|
|

|
|

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