소켓 송신 함수에서 계속해서 송신을 하는데, 수신하는 쪽에서 송신 속도를 따라가지 못하면 언젠가 송신 쪽 소켓 버퍼가 가득 찰 것입니다. 소켓의 송신 버퍼에 빈 공간이 없으면 블로킹이 발생하며, 조금이라도 빈 공간이 생기면 블로킹이 끝나고 소켓 함수는 리턴합니다. 어쨌든 송신 함수는 블로킹이 일어날 수도 있고 그렇지 않을 수도 있다는 것을 기억해 두세요.
다행히 대부분 운영체제에서는 소켓 함수가 블로킹되지 않게 하는 API를 추가로 제공합니다. 이를 논블록 소켓이라고 합니다.
논블록 소켓을 사용하는 방법은 크게 다음과 같습니다.
1. 소켓을 논블록 소켓으로 모드 전환합니다.
2. 논블록 소켓에 대해 평소처럼 송신, 수신, 연결과 관련된 함수를 호출합니다.
3. 논블록 소켓은 무조건 이 함수 호출에 대해 즉시 리턴합니다. 리턴 값은 ‘성공’ 혹은 ‘would block’ 오류 둘 중에 하나입니다.
would block이란 “블로킹 걸렸어야 할 상황인데 말이지, 어쨌건 자네는 운이 좋아. 블로킹 안 걸렸잖아?”라는 의미입니다.