이를 논블록 소켓으로 처리하면 블로킹이 난무하는 문제가 사라집니다.
List<Socket> sockets; void NonBlockSocketOperation() { foreach(s in sockets) // 각 소켓에 대해 { // 논블록 수신. 오류 코드와 수신된 데이터를 받는다. (result, data) = s.receive(); if (data. > 0) // 잘 수신했으면 { print(data); // 출력 } else if (result != EWOULDBLOCK) { // would block이 아니면 오류가 난 것이므로 // 필요한 처리를 한다. ...; } } }
이 코드는 루프를 돌면서 논블록 수신을 합니다. 수신할 데이터가 있으면 그냥 꺼내서 처리합니다. 수신할 데이터가 없으면 would block 코드를 리턴할 뿐 수신 함수는 즉시 리턴해 버립니다. 따라서 많은 수의 소켓 데이터를 지연 시간 없이 처리할 수 있습니다.
논블록 수신 함수가 would block 코드를 리턴한 경우에는 잠시 후 다시 논블록 수신 함수를 호출하면 됩니다. 수신된 것이 있으면 수신된 데이터가 리턴될 것이고, 그렇지 않다면 would block 코드가 또 나올 것입니다.
Tip
소켓 프로그래밍은 지저분하고 까다롭기로 유명합니다. 그것은 함수들의 입출력 매개변수와 리턴 값 설명이 매우 길기 때문입니다. 게다가 이들 설명을 자세히 읽지 않으면 몇 가지 예외 경우를 놓치면서 고생합니다. 따라서 소켓 프로그래밍을 할 때는 소켓 API 도움말을 (내용이 길더라도) 꼼꼼하게 확인해 보세요.