Pergunta

Estou usando este exemplo de implementação encontrados em http: // tangentsoft. net / wskfaq / examples / básico / select-server.html

Esta é fazer mais do que eu preciso, lida com conexões sem bloqueio e faz todo o trabalho em seu segmento (não criar uma nova thread para cada conexão como alguns exemplos fazem), mas estou preocupado desde que eu tenho dito winsock só vai apoiar max 64 connectios cliente: S

É este 64 conexões verdade?

Que outras opções eu tenho? Seria legal ter um exemplo c ++ para uma implementação similar.

Graças

Foi útil?

Solução

biblioteca alternativa:

Você deve considerar o uso impulso asio . É uma biblioteca de rede multi-plataforma que simplifica muitas das tarefas que você pode ter que fazer.

Você pode encontrar o código fonte de exemplo que você procura aqui .


Sobre o limite de 64:

Não há limite de 64 conexão duro que você vai experimentar com um bom design. Basicamente, se você usar algum tipo de modelo de segmento que você não vai sentir essa limitação.

Aqui estão algumas informações sobre o limite que você ouviu falar sobre: ??

4.9 - Quais são as "64 soquetes" limitações

Existem duas limitações de 64 de soquete:

O mecanismo evento Win32 (e.g. WaitForMultipleObjects ()) só podem esperar em 64 objetos de eventos de uma só vez. Winsock 2 fornece o WSAEventSelect () função que permite você usa mecanismo de eventos do Win32 para esperar por eventos soquetes. Porque isso usa o mecanismo de evento do Win32, você pode só esperam para eventos em 64 tomadas na um tempo. Se você quiser esperar mais de 64 Winsock evento objetos em um tempo, você precisa usar múltiplos tópicos, cada um espera em não mais do que 64 das tomadas.

A função select () também é limitado em determinadas situações a espera de 64 soquetes de cada vez. o FD_SETSIZE constante definida em winsock.h determina o tamanho da fd_set estruturas que você passa para selecionar (). Está definido por padrão para 64. Você pode definir esta constante a um valor mais elevado antes de #include winsock.h, e isso irá substituir o valor padrão. Infelizmente, pelo menos um não-Microsoft Winsock pilha e alguns Provedores de serviços em camadas assumir a padrão de 64; eles vão ignorar soquetes além do 64º em maior FD_SETs.

Você pode escrever um programa de teste para tentar este sobre os sistemas que você planeja suporte, para ver se eles não são limitado. Se eles forem, você pode obter em torno deste com fios, assim como você faria com objetos de evento.

Fonte

Outras dicas

@ 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;
                }

Para o OP:

Por que você não quer usar Winsock2? Você poderia tentar olhar para construir o seu próprio servidor usando IOCP, embora tornando esta plataforma cruzada é um pouco complicado. Você poderia olhar para boost :: asio como Brian sugeriu.

Antes de decidir que precisa de 'alternativas para Winsock2" por favor leia isto: Programação de rede para Microsoft Windows .

Em resumo, você não precisa de uma 'alternativa para Winsock2' você precisa entender como usar os modelos de programação fornecidos ao pleno efeito sobre a plataforma que você está alvejando. Então, se você realmente necessidade Código de plataforma cruzada soquetes que usos assíncronos I / O, em seguida, olhar para ASIO, mas, se não o fizer realmente precisa código de plataforma cruzada então considerar algo que realmente incide sobre os problemas que você pode ter sobre a plataforma que você precisa se concentrar em - ou seja, algo específico janelas. Volte para o livro mencionado acima e ter um olhar para as várias opções que você tem.

A opção mais performance e escalável é usar Portas IO conclusão. Eu tenho algum código livre disponível a partir aqui que torna bastante fácil de escrever um servidor que escalas e executa bem em um Windows (NT) plataforma de base; a página vinculada também links para alguns artigos que eu escrevi sobre isso. Uma comparação da minha estrutura para ASIO pode ser encontrada aqui: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top