문제

이 예제 구현을 사용하고 있습니다 http://tangentsoft.net/wskfaq/examples/basics/select-server.html

이것은 내가 필요한 대부분의 작업을 수행하고, 차단하지 않고 연결을 처리하며, 모든 스레드에서 작동합니다 (일부 예와 같이 각 연결에 대한 새 스레드를 만들지 않음). Max 64 Client Connectios : s

이 64 개의 연결이 사실입니까?

다른 선택은 무엇입니까? 유사한 구현에 대한 C ++ 예제를 갖는 것이 좋습니다.

감사

도움이 되었습니까?

해결책

대체 라이브러리 :

사용을 고려해야합니다 ASIO를 향상시킵니다. 그것은 당신이해야 할 많은 작업을 단순화하는 크로스 플랫폼 네트워킹 라이브러리입니다.

당신은 찾을 수 있습니다 여기서 원하는 소스 코드.


64 한도 약 :

좋은 디자인으로 경험할 단단한 64 연결 제한은 없습니다. 기본적으로 어떤 종류의 스레딩 모델을 사용하는 경우이 제한을 경험하지 않습니다.

다음은 다음과 같은 한계에 대한 정보입니다.

4.9- "64 소켓"제한 사항은 무엇입니까?

두 가지 64 소켓 제한 사항이 있습니다.

Win32 이벤트 메커니즘 (예 : WaitformultipleObjects ())는 한 번에 64 개의 이벤트 객체에서만 기다릴 수 있습니다. Winsock 2는 WSAEVENTELECT () 함수를 제공하여 Win32의 이벤트 메커니즘을 사용하여 소켓의 이벤트를 기다릴 수 있습니다. Win32의 이벤트 메커니즘을 사용하기 때문에 한 번에 64 개의 소켓의 이벤트 만 기다릴 수 있습니다. 한 번에 64 개 이상의 윈콕 이벤트 객체를 기다리려면 여러 스레드를 사용해야합니다.

select () 함수는 특정 상황에서 한 번에 64 개의 소켓을 기다리는 것으로 제한됩니다. Winsock.h에 정의 된 FD_Setsize 상수는 select ()로 전달하는 FD_SET 구조의 크기를 결정합니다. 기본적으로 64로 정의됩니다. #include winsock.h 전에이 상수를 더 높은 값으로 정의 할 수 있습니다. 이는 기본값을 무시합니다. 불행히도, 적어도 하나의 비 미생물 윈콕 스택과 일부 계층 서비스 제공 업체는 기본값이 64를 가정합니다. 그들은 더 큰 FD_Sets에서 64 번째를 넘어서 소켓을 무시할 것입니다.

지원하려는 시스템에서이를 시도하여 제한이 없는지 확인하기 위해 테스트 프로그램을 작성할 수 있습니다. 그들이 있다면, 당신은 이벤트 객체와 마찬가지로 스레드로 이것을 둘러 볼 수 있습니다.

원천

다른 팁

@Brian :

                if ((gConnections.size() + 1) > 64) {
                    // For the background on this check, see
                    // www.tangentsoft.net/wskfaq/advanced.html#64sockets
                    // The +1 is to account for the listener socket.
                    cout << "WARNING: More than 63 client "
                            "connections accepted.  This will not "
                            "work reliably on some Winsock "
                            "stacks!" << endl;
                }

OP에 :

Winsock2를 사용하고 싶지 않은 이유는 무엇입니까? 이 크로스 플랫폼을 만드는 것은 약간 까다 롭지 만 IOCP를 사용하여 자신의 서버를 구축하려고 노력할 수 있습니다. Brian이 제안한 것처럼 Boost :: Asio를 볼 수 있습니다.

'Winsock2에 대한 대안'이 필요하다고 결정하기 전에 이것을 읽으십시오. Microsoft Windows 용 네트워크 프로그래밍.

요약하면, 'Winsock2에 대한 대안'이 필요하지 않습니다. 당신은 당신이 타겟팅하는 플랫폼에 완전히 영향을 미치기 위해 제공되는 프로그래밍 모델을 사용하는 방법을 이해해야합니다. 그럼, 당신이 정말로 필요 Async I/O를 사용하는 크로스 플랫폼 소켓 코드는 ASIO를 보지만, 그렇지 않은 경우 정말 필요한 크로스 플랫폼 코드는 실제로 플랫폼에 초점을 맞출 수있는 문제 (즉, Windows)에 초점을 맞출 수있는 문제에 실제로 중점을 둔 것을 고려하십시오. 위에서 언급 한 책으로 돌아가서 다양한 옵션을 살펴보십시오.

가장 성능이 뛰어나고 확장 가능한 옵션은 IO 완료 포트를 사용하는 것입니다. 무료 코드가 있습니다 여기 따라서 Windows (NT) 기반 플랫폼에서 잘 작동하는 서버를 쉽게 작성할 수 있습니다. 링크 된 페이지는 또한 내가 쓴 몇 가지 기사와 링크합니다. 내 프레임 워크를 ASIO와 비교하는 것은 여기에서 찾을 수 있습니다. http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-toostasio.html.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top