10 개 (또는 그 이상) 다른 클라이언트의 연결을 허용 할 수있는 서버 프로그램이 있다고 가정 해 보겠습니다. 클라이언트는 서버가 수신 한 임의의 데이터를 전송하지만 적어도 하나의 클라이언트가 모든 업데이트 데이터를 전송할 것입니다. 서버는 다른 처리가 있기 때문에 정보가 도착할 때까지 기다릴 수 없습니다. 비동기 소켓을 사용하는 것 외에도 두 가지 옵션이 있습니다.여러 개의 소켓을 사용 중입니까?
모든 소켓을 비 블로킹으로 만듭니다. 각 소켓에서
recv()
을 호출하고 사용 가능한 데이터가없고으로 실패하면 허용하고 일부 데이터를 얻은 다음 보관하십시오.소켓을 차단 상태로 둡니다. 모든 소켓을
FD_SET
에 추가하고select()
으로 전화하십시오. 반환 값이 0이 아닌 경우 (대부분의 시간이 됨) 모든 소켓을 반복하여FD_ISSET()
과 함께 읽을 수있는 소켓의 적절한 수를 찾고 읽을 수있는 소켓에recv()
만 호출합니다.
첫 번째 옵션은 recv()
함수를 더 많이 호출합니다. 두 번째 방법은 프로그래밍의 관점에서 보면 FD_SET
및 FD_ISSET
루핑이 모두 발생하므로 큰 고통입니다.
선호되는 방법 (또는 다른 방법)은 무엇입니까? recv()
을 select()
이라는 번거 로움이없는 논 블로킹 소켓에서 사용할 수 없게하는 오버 헤드를 피하고 있습니까?
나는 두 가지 방법을 모두 이해하고 있으며 두 가지를 모두 시도했다고 생각하지만 한 가지 방법이 더 좋고 최적인지는 잘 모릅니다.
감사합니다. 이 구현에서는 오버랩 IO를 사용하고 싶지 않지만 제안에 감사드립니다. 나는 그것을 들여다 볼 것이다. 비 차단 모드와 select() 사용에 대한 귀하의 제안을 이해합니다. 내 주요 질문은 recv를 아무 이유없이 호출해야하거나 select()를 호출하는 동작을 거쳐야했다. 답장을 보내 주셔서 감사합니다! – JPhi1618
은 조금 더 명확하게 업데이트했습니다. 단지'recv()'가 CPU를 100 % 페그하려고 할 때 루프를 돌리는 것이 결코 좋은 일이 아닙니다. – bdonlan