MUSCLE significa Multi User Server Client Linkage Environment e é um sistema de mensagens open source, gratuito, robusto, escalável e de plataforma cruzada que compreende componentes de servidor e cliente. Ele ajudará você a escrever todos os tipos de software distribuído, desde jogos multiplayer e clientes de bate-papo IRC, até aplicativos de cálculo SETI.
Recursos em resumo
Com o MUSCLE, os usuários poderão personalizar facilmente o "servidor musculoso" incluído, definindo sua própria lógica de sessão ou protocolo de transmissão de mensagens. O software ajuda você a escrever seu código de cliente em qualquer uma das linguagens de programação C ++, C, C #, Java, Delphi ou Python.
O programa usa o músculo parecido com o BMessage :: Mensagens, suporta o envio de músculos achatados :: Mensagens entre computadores via fluxos TCP (Transmission Control Protocol), implementa um & ldquo; muscled server & rdquo; em uma máquina servidora, permitindo que você escreva programas clientes que podem ser usados para se comunicar com o servidor.
Além disso, inclui APIs de mensagens simples e múltiplas que suportam todas as linguagens de programação mencionadas anteriormente. O & ldquo; muscled server & rdquo; pode ser facilmente personalizado definindo um protocolo de transmissão de mensagens ou uma lógica de sessão.
Começando com MUSCLE
Após um login bem-sucedido, os programas clientes podem determinar quem mais está logado no servidor central, bem como armazenar músculo: Mensagens na RAM (memória do sistema) e enviar musculos :: Mensagens para outros clientes que estão conectados para o servidor. Observe que os programas clientes podem se inscrever em dados específicos no servidor e receber notificações instantâneas quando os dados são alterados.
Suporta uma ampla gama de roteamentos de mensagens
O software foi projetado para oferecer suporte a uma ampla gama de roteamentos de mensagens, incluindo estilo estilo unicast, estilo broadcast e estilo multicast, por meio de um mecanismo de roteamento inteligente e hierárquico de correspondência de padrões.
Sistemas Operacionais Suportados e Disponibilidade
O MUSCLE é executado em qualquer sistema operacional compatível com POSIX. Ele é distribuído como um arquivo de fontes único e universal que permite aos usuários otimizar o aplicativo para seu sistema GNU / Linux. Ambas as plataformas de hardware de 32 e 64 bits são suportadas no momento.
O que há de novo nesta versão:
- testes / Makefile-mt não tenta mais compilar testreflectsession, exceto ao executar em um SO que o testreflectsession suporta.
- Fiz algumas pequenas edições e re-arranjos do "MUSCLE por exemplo" páginas.
- Substitui um número de `tags` nos MkDocs por [URLs] (...)
- Removida a herança particular de CountedObject de todas as classes que a tinham - agora elas incluem uma variável de membro particular CountedObject. Isso foi feito apenas porque toda essa herança privada estava atravancando os gráficos de herança do DOxygen.
- Adicionada uma macro DECLARE_COUNTED_OBJECT a CountedObject.h para que qualquer possível sobrecarga de memória de CountedObjects possa ser eliminada nos casos em que a contagem de objetos não seja desejada.
- Removido o suporte para o -DMUSCLE_AVOID_OBJECT_COUNTING e adicionada uma macro -DMUSCLE_ENABLE_OBJECT_COUNTING em seu lugar. (Ou seja, a classe CountedObject agora está desativada por padrão e deve ser ativada explicitamente para usá-la)
- Adicionado "MUSCLE por exemplo" documentação para MiscUtilityFunctions. {cpp, h}
- Foi alterado um número de `tags` na fonte MkDocs MUSCLE-by-Example para [urls], de modo que os métodos mencionados por eles possam ser rapidamente revisados.
- server / Makefile agora especifica libmuscle.a após o arquivo main () .o.
- Corrigidos alguns avisos do gcc na pasta de testes (de acordo com as sugestões do Mika)
- UnparseFile () não estava citando palavras-chave com espaços corretamente. Corrigido.
- Corrigidas as dependências no & quot; MUSCLE por exemplo & quot; exemplos 'Makefiles.
O que há de novo na versão:
- Adicionou um método de conveniência ShrinkToFit () à Queue, Hashtable, e classes String. Esse método reduz o objeto para que a quantidade de memória alocada internamente corresponda ao tamanho dos dados que está sendo retido.
- Hashtable :: EnsureSize () e Queue :: EnsureSize () agora aceitam um argumento opcional (allowShrink), que (se definido como true) permite que a matriz alocada internamente do objeto seja realocada se for maior que o necessário.
- Ajustou o comportamento de expansão do buffer da classe String para ser um pouco mais eficiente.
- Adicionada uma proteção contra uma possível recursão infinita que pode ocorrer durante o registro de um "OUT OF MEMORY" erro após uma falha de alocação de memória, se um LogCallback tentou alocar memória.
O que há de novo na versão 6.01:
- Adicionou um método de conveniência PrependWord () à classe String.
- Adicionamos métodos convenientes WithReplacements () à classe String.
- Adicionado um método SetExplicitDelayMicros () à classe DetectNetworkConfigChangesSession.
- Adicionado um método IsCopperDetected () à classe NetworkInterfaceInfo, para que o código possa dizer se um conector Ethernet está ou não conectado a ele.
- Adicionou um & quot; quietsend & quot; argumento para hextermo.
- O método virtual NetworkInterfacesChanged () na classe DetectNetworkConfigChangesSession foi alterado para aceitar um argumento que indique quais interfaces de rede foram alteradas. Esta funcionalidade está atualmente implementada apenas no Linux, MacOS / X e Windows. Para outros sistemas operacionais, o argumento sempre será uma lista vazia.
- Corrigido um erro na implementação Linux de DetectNetworkConfigChangesSession que poderia causar uma falha de segmentação se recvmsg () retornasse um erro (por exemplo, devido a um sinal recebido).
O que há de novo na versão 6.00:
- Reescreveu a classe SSLSocketDataIO para funcionar melhor com E / S sem bloqueio (em conjunto com a nova classe SSLSocketAdapterGateway).
- Adicionadas implementações de SSLSocketDataIO :: SetPrivateKey () e SSLSocketDataIO :: SetCertificate () que usam um ByteBuffer como argumento.
- Adicionada uma classe SSLSocketAdapterGateway que é usada para gerenciar a máquina de estado interna do OpenSSL ao usar uma classe SSLSocketDataIO com seu gateway.
- Adicionados os métodos SetSSLPrivateKey () e GetSSLPrivateKey () à classe ReflectServer, para facilitar a ativação da autenticação SSL em todas as conexões TCP recebidas. Estes métodos estão disponíveis se o MUSCLE_ENABLE_SSL estiver definido.
- Adicionados os métodos SetSSLPublicKeyCertificate () e GetSSLPublicKeyCertificate () à classe ReflectServer, para facilitar a ativação da autenticação SSL nas conexões TCP de saída. Estes métodos estão disponíveis se o MUSCLE_ENABLE_SSL estiver definido.
- Adicionados os métodos SetSSLPrivateKey () e SetSSLPublicKeyCertificate () à classe MessageTransceiverThread, para facilitar a ativação da funcionalidade SSL ao usar E / S com threads.
- Adicionada uma pasta ssl_data com algumas informações sobre como gerar pares de chaves públicas / privadas do OpenSSL e um exemplo de par de chaves para uso no teste do OpenSSL.
- Quando MUSCLE_ENABLE_SSL é definido, muscled agora aceita um argumento opcional 'privatekey = filename'. Quando especificado, o modo SSL será ativado e musculado aceitará apenas conexões TCP de entrada que apresentem chaves públicas que correspondam a essa chave / certificado particular.
- Quando MUSCLE_ENABLE_SSL for definido, portablereflectclient e qt_example agora aceitarão um argumento opcional 'publickey = filename'. Quando especificado, o modo SSL será ativado e esses clientes se conectarão ao muscled usando o OpenSSL e apresentarão esse arquivo como suas credenciais.
- Adicionou um & quot; Animate & quot; caixa de seleção para a demonstração qt_example. A verificação faz com que a janela mova seu indicador automaticamente. Isso é divertido e também útil se você quiser testar um cenário em que vários clientes estão gerando tráfego simultaneamente.
- tornou a demonstração qt_example mais bonita.
- Renomearam as macros auxiliares do C ++ 11 em Hashtable.h e Queue.h para torná-las menos propensas a colidir com as macros de outros pacotes. * Corrigido alguns pequenos erros na classe SSLSocketDataIO. o Renomeado SSLSocketDataIO :: SetKey () para SetPrivateKey (). o Renomeado SSLSocketDataIO :: SetCertificate () para SetPublicKeyCertificate (). o AbstractMessageIOGateway :: SetDataIO () é agora um método virtual.
O que há de novo na versão 5.92:
- Melhor suporte para a semântica de movimentação de C ++ 11 nas classes Queue e Hashtable (ativada somente quando -DMUSCLE_USE_CPLUSPLUS11 é definido)
- Adicionada alguma instrumentação à classe String para que eu possa observar quantas vezes um objeto String é copiado, movido, etc. (ativado somente quando -DMUSCLE_COUNT_STRING_COPY_OPERATIONS está definido)
- Adicionada uma função PrintAndClearStringCopyCounts (), que imprimirá os dados da operação String coletados acima.
- Adicionada alguma magia do SFINAE ao muscleSwap () para que ele seja alternado chamando SwapContents () sempre que possível, em vez de copiá-lo para um objeto temporário.
- Adicionado um construtor de lista de inicialização e sobrecarga de AddTailMulti () à classe Queue (disponível somente quando -DMUSCLE_USE_CPLUSPLUS11 é definido, é claro)
- Renomeado as sobrecargas de Fila e matriz de Queue :: AddTail () para AddTailMulti (), para evitar conflitos com o novo suporte de análise de modelo do C ++ 11.
- Renomeado as sobrecargas de Fila e matriz de Queue :: AddHead () para AddHeadMulti (), para evitar conflitos com o novo suporte de análise de modelo do C ++ 11.
- Substitui a macro MCRASH_IMPL por uma chamada para afirmar (falso).
- Um pouco mais de compatibilidade com o Android.
- Muitos dos programas na pasta de testes não estavam sendo compilados no C ++ 11. Corrigido.
- Corrigidos vários erros potenciais que foram detectados pela ferramenta de análise estática do clang.
O que há de novo na versão 5.91:
- Adicionou o método de conveniência EnsureCanPut () à classe Hashtable.
- Adicionado o método de conveniência EnsureCanAdd () à classe Queue.
- Alterou DoMutexAtomicIncrement () para ser uma função inline para tornar a chamada mais eficiente.
- QMessageTransceiverThread e QAcceptSocketsThread foram alterados para chamar QCoreApplication :: postEvent () em vez de QApplication :: postEvent (), para permitir aplicativos QT não-GUI.
- Atualizado o documento do Guia do Principiante para refletir o melhor suporte UDP do MUSCLE.
- Mesclado em algumas alterações de compatibilidade do Android fornecidas por Jean-François Mullet.
- O uso do sinalizador de compilação MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS faria com que MUSCLE falhasse na inicialização devido a um problema na ordem de operações. Isso foi corrigido agora.
- O sinalizador de compilação MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS era usado anteriormente somente se nenhuma outra implementação do AtomicCounter estivesse disponível. Agora, o sinalizador tem precedência mais alta, portanto, configurar o sinalizador significa que o Mutexes será usado, mesmo que outro mecanismo (mais eficiente) esteja disponível.
O que há de novo na versão 5.90:
- Adicionado um método GetPacketMaximumSize () à classe DataIO para permitir que o código do gateway manipule de forma mais inteligente a comunicação empacotada no estilo UDP.
- O MessageIOGateway agora funciona de maneira útil em conjunto com o UDPSocketDataIO.
- Adicionadas funções do modelo CreateObjectFromArchiveMessage () ao Message.h, para servir como uma contraparte do lado do restauro para GetArchiveMessageFromPool (), etc.
- AtomicCounter :: AtomicIncrement () agora retorna um booleano (true se o novo valor do contador for igual a um).
- Modificada a classe HashtableIterator para que as iterações de Hashtable somente leitura sejam agora seguras para thread, mesmo se o sinalizador HTIT_FLAG_NOREGISTER não for especificado.
- Adicionada uma classe muscle_thread_id ao SetupSystem.h, para representar adequadamente um ID de thread de maneira neutra à implementação.
- Adicionado um & quot; deadlock & quot; programa para a pasta de testes. Este programa deliberadamente corre o risco de criar um impasse, como uma maneira de exercitar / demonstrar o teste do deadlockfinder.
- Adicionado suporte para um sinalizador de linha de comando -DMUSCLE_AVOID_THREAD_SAFE_HASHTABLE_ITERATORS, para aqueles que preferem evitar a sobrecarga da segurança de encadeamentos automática e prometem fornecer argumentos HTIT_FLAG_NORREGISTER manualmente, quando necessário.
- Adicionado um cache de pesquisa LRU opcional à função GetHostByName (), para que ele possa retornar mais rapidamente quando os mesmos nomes de host forem resolvidos repetidamente.
- Adicionada uma função SetHostNameCacheSettings () que habilita e ajusta o cache de pesquisa de LRU em GetHostByName ().
- Adicionado suporte para & quot; dnscache & quot; e & quot; dnscachesize & quot; argumentos de linha de comando no HandleStandardDaemonArgs (), para permitir a especificação de linha de comando do comportamento do cache de pesquisa LRU.
- Modificada a classe Hashtable para que os valores de _iterHead, _iterTail e _freeHead sejam agora uint32s em vez de ponteiros, para reduzir o uso de memória.
- Removido o método ThreadLocalStorage :: SetFreeHeldObjectsOnExit () e adicionado um argumento booleano ao seu construtor, já que os pthreads não permitem que você altere essa configuração depois que pthread_key_create () for chamado.
- Transferiu GetCurrentThreadID () para a classe muscle_thread_id como uma função de membro estático e alterou-a para retornar um objeto muscle_thread_id em vez de um tempo não assinado.
- Alterou o nome do host padrão para sessões sem um endereço IP conhecido de & quot; & quot; para & quot; _conhecidos_ & quot ;, como os colchetes angulares na cadeia antiga têm um significado especial a partir da versão 5.84, e isso pode interferir na correspondência do caminho do nó de formas não intencionais.
- Os métodos CalculateChecksum () em Message.cpp foram modificados para serem mais robustos na detecção de diferenças de transposição de dados.
- Foi removido o suporte a MUSCLE_USE_QT_FOR_ATOMIC_OPERATIONS do AtomicCounter.h, pois a classe QAtomicInt do Qt não suporta a funcionalidade que o novo valor de retorno do método AtomicIncrement () requer.
- Removido MessageIOGateway :: FlattenMessage () e MessageIOGateway :: UnflattenMessage (). Adicionado em seu lugar: MessageIOGateway :: FlattenHeaderAndMessage () e MessageIOGateway :: UnflattenHeaderAndMessage (). Esses novos métodos lidam com os bytes de cabeçalho e o corpo da mensagem ao mesmo tempo.
- Adicionamos um arquivo udpproxy.vcproj à pasta de testes, para ajudar a compilar o udpproxy no Windows.
- Mensagem: Flatten () agora itera sobre os campos na Mensagem uma vez, em vez de duas vezes.
- GetCurrentThreadID () agora é uma função embutida, já que agora pode ser chamada frequentemente pelo HashtableIterator.
- Modificado o código do deadlockfinder para usar Filas em vez de Hashtables, já que muscle_thread_id não pode mais ser usado como um tipo de chave Hashtable.
- Corrigido testudp.cpp para usar corretamente um MessageIOGateway para sua comunicação UDP.
- Ajustou um pouco mais o ifdefs em FilePathInfo.cpp para que statInfo.st_birthtimespec não seja acessado ao usar os SDKs do MacOS / X que não o fornecem.
- O MessageDataIOGateway não tenta mais desfazer uma mensagem de um buffer de dados deflacionado pelo zlib que não foi possível inflar novamente.
- Corrigido um erro no SendDataUDP () que fazia com que o SendDataUDP () retornasse incorretamente um erro ao enviar para um endereço multicast usando o modo sem bloqueio, e o buffer de saída estava cheio.
O que há de novo na versão 5.85:
- Adicionadas chamadas LogTime (MUSCLE_LOG_DEBUG) a todos os caminhos de erro em MessageIOGateway :: DoInputImplementation () e Message :: Unflatten (), para que seja mais fácil determinar quando as conexões TCP estão sendo interrompidas devido a dados corrupção.
- Adicionada uma função PreviousOperationHadTransientFailure (), que retorna true iff errno é EINTR ou ENOBUFS.
- Especificar spamspersecond = -1 agora fará com que o hexterm envie dados de spam o mais rápido possível.
- A implementação MUSCLE_USE_POLL do SocketMultiplexer.h estava fornecendo POLLERR para WSAPoll (), mas o WSAPoll () não suporta POLLERR, portanto, o WSAPoll () retornaria um erro quando isso ocorresse. Trabalhou em torno do problema filtrando o POLLERR ao compilar no Windows.
- Corrigido um bug no qual send () retornando ENOBUFS poderia fazer com que a conexão do soquete fosse finalizada, mesmo que o ENOBUFS não seja uma condição fatal.
- SocketMultiplexer.cpp não compilará quando MUSCLE_USE_POLL foi definido. Corrigido.
- O método ZLibCodec :: Deflate () não compactaria todos os dados em um buffer muito grande (por exemplo, mais de 42 MB). Corrigido.
O que há de novo na versão 5.84:
- A sintaxe do intervalo numérico da classe StringMatcher foi estendida para que você possa especificar vários intervalos. Por exemplo, & quot; & quot; corresponderia às cadeias "19", "20", "21", "25", "30", "31", e "50".
- Adicionadas funções de conversão GetCurrentTime64ForRunTime64 () e GetRunTime64ForCurrenTime64 () a TimeUtilityFunctions.h.
- Adicionado um método de utilitário GetDescendant () à classe DataNode.
- Adicionados os construtores de movimento C ++ 11 e os operadores de atribuição de movimento às classes Hashtable, Queue, String, Message e ByteBuffer. Para compatibilidade com antigos compiladores, este código só será compilado se -DMUSCLE_USE_CPLUSPLUS11 for especificado na linha de compilação.
- SharedMemory agora será nerf em uma classe de memória não compartilhada, se -DMUSCLE_FAKE_SHARED_MEMORY for especificado.
- Adicionou um teste testfilepathinfo à pasta de testes.
- Atualize todos os cabeçalhos de avisos de direitos autorais para ler o 2000-2013 Meyer Sound.
- Espaços adicionados entre tokens de macro (por exemplo, UINT32_FORMAT_SPEC) e constantes de string (por exemplo, "Hello") para tornar felizes os compiladores de C ++ 11.
- ByteBuffer.cpp tinha um erro de sintaxe que o impediria de compilar em hosts big-endian. Corrigido.
- MacOS / X: substituídas chamadas de funções de carbono reprovadas com equivalentes de Mach, para evitar avisos de descontinuação sob 10.8.x.
A classe
O
Apenas
O que há de novo na versão 5.83:
- Adicionadas versões de conveniência de InflateByteBuffer () e DeflateByteBuffer () que tome um ByteBufferRef como um argumento.
- Foram removidos alguns métodos obsoletos / não utilizados (EnsureBufferSize () e FreeLargeBuffer ()) da classe AbstractMessageIOGateway.
- Corrigidos alguns erros nos comentários na subpasta delphi.
- A classe Hashtable não gera mais avisos quando compilada no MSVC com -DMUSCLE_AVOID_MINIMIZED_HASHTABLES definido.
- Corrigido um erro no IPAddressAndPort :: ToString () que fazia com que as cadeias de endereços IPv4 fossem formatadas de forma ambígua quando (preferIPv4Style) era definido como falso.
Comentários não encontrado