논블록 소켓으로 모드를 바꾼 후 송신 함수 호출은 언제나 즉시 리턴합니다(➊). 여기서 리턴 값을 체크해야 합니다. 리턴 값이 would block이라는 오류 코드면 “블로킹 걸릴 상황이었어!”라는 것입니다. 송신 함수에서 would block이 리턴되면 아무것도 하지 않았음을 의미합니다. 따라서 아무것도 송신하지 않은 상태입니다. 이 경우 송신 함수 호출을 나중에 다시 해 주어야 합니다.
송신 함수가 성공적으로 소켓 송신 버퍼에 데이터를 넣었으면, 송신 함수는 보낸 데이터 크기를 리턴합니다. 오류 코드가 would block이 아니라면 뭔가 다른 문제가 생긴 것입니다. 이때는 여러분이 소켓 API 도움말을 보면서 무엇이 잘못되었는지 체크해야 합니다.
이 코드는 ➋에서 CPU 사용량이 늘어난다는 문제가 있습니다. 뒤에서 설명할 것이므로 일단은 넘어가겠습니다.
또 논블록 소켓을 이용하면 한 스레드에서 여러 소켓을 한꺼번에 다룰 수 있습니다. 여러분이 루프를 돌면서 소켓 100개에 대한 수신 함수 recv()나 recvfrom()을 호출한다고 가정합시다. 모든 소켓이 다 수신할 데이터를 이미 받아 놓은 상태는 아닐 것입니다. 따라서 루프를 도는 동안 블로킹, 블로킹, 블로킹…이 난무할 것이고 매우 비효율적인 프로그램이 되겠지요. 받은 데이터를 제때제때 처리하지 못하기 때문입니다.