소켓에서 발생하는 이벤트 - 소켓에서 읽기와 쓰기(2/2)
소켓으로부터 데이터의 읽기, 쓰기 작업은 데이터를 수신, 송신하는 동작입니다. 소켓의 특성에 따라 두 가지로 나눌 수 있는데, Blocking socket과 Non-Blocking socket 입니다. 어쩌면 Non-Blocking 소켓을 처음듣는 분이 계실지도 모르겠네요. 소켓 프로그래밍을 다룬다고 하면 Blocking 소켓을 의미하는 경우가 많습니다. 이제 두 가지 소켓 종류에 따라 읽기, 쓰기 작업의 구현이 어떻게 달라져야하는지 알아보겠습니다. Blocking 소켓 소켓에서 처리되기를 원하는 작업이 완료된 이후 함수가 반환되어 다음 작업이 수행됩니다. 예를 들어, 쓰기(send) 작업의 경우에 내가 전송하려는 데이터가 모두 전송되면 send() 함수가 리턴됩니다. Non-Blocking 소켓 소켓에서 현재 처리될 수 없는 작업이면 기다리지 않고 즉시 반환됩니다. 반환값에 따라 적절한 처리가 필요합니다. 읽기, 쓰기 함수의 동작을 구체적으로 알아보고 구현상 주의해야할 점에 대해서 적어보겠습니다. 1. 읽기작업(recv 함수) 수신 구현을 알아보기 전에 먼저 수신 버퍼의 존재를 이해 해야합니다. 앞의 블로그( 링크 )에서 설명한 Receive Buffer에 대한 설명을 가져왔습니다. ==== Receive Buffer: 원격으로부터 전송받은 데이터를 임시로 저장하는 공간입니다. 데이터를 수신하게 되면 임시로 이 공간에 저장합니다. 이 공간은 커널영역의 메모리입니다. 어플리케이션에서 소켓으로부터 읽기를 시도하면 이 버퍼로부터 데이터를 가져오는 동작을 수행합니다. (즉, 커널영역의 메모리 공간에서 유저모드의 메모리 공간으로 복사가 발생함) ==== Blocking Socket를 다룰 때, recv() 함수의 동작은 아래와 같습니다. recv() 함수를 호출하는 시점에, (1) Receive Buffer 에 수신된 데이터가 이미 있다면, 그 데이터를 가져온 후에 반환. (2) Receive Buffer 가 비어있고 연결이...