MUSCLE è l'acronimo di Multi Link Server Client Linkage Environment ed è un sistema di messaggistica open source, gratuito, robusto, scalabile e multipiattaforma che comprende componenti server e client. Ti aiuterà a scrivere ogni sorta di software distribuito, dai giochi multiplayer e dai client di chat IRC, alle app di calcolo SETI.
Caratteristiche a colpo d'occhio
Con MUSCLE, gli utenti saranno in grado di personalizzare facilmente il "server muscoloso" incluso definendo la propria logica di sessione o il protocollo di streaming dei messaggi. Il software ti aiuta a scrivere il tuo codice cliente in entrambi i linguaggi di programmazione C ++, C, C #, Java, Delphi o Python.
Il programma utilizza il muscolo di tipo BMessage :: Messaggi, supporta l'invio di muscoli appiattiti :: Messaggi tra computer tramite TCP (Transmission Control Protocol) flussi, distribuzione di un & ldquo; server muscoloso & rdquo; su un server, consentendo di scrivere programmi client che possono essere utilizzati per comunicare con il server.
Inoltre, include API di messaggistica a thread singolo e multiplo che supportano tutti i suddetti linguaggi di programmazione. & Ldquo; server muscoloso & rdquo; può essere facilmente personalizzato definendo un protocollo di streaming dei messaggi o una logica di sessione.
Introduzione a MUSCLE
Dopo un login riuscito, i programmi client possono determinare chi altro ha effettuato l'accesso al server centrale, oltre a memorizzare muscle :: Messages nella RAM (memoria di sistema) e inviare muscle :: Messages ad altri client che sono collegati al server. Tieni presente che i programmi client possono iscriversi a dati specifici sul server e ricevere notifiche istantanee quando i dati cambiano.
Supporta una vasta gamma di percorsi di messaggi
Il software è stato progettato per supportare una vasta gamma di percorsi di messaggi, inclusi stili unicast, broadcast-style e multicast-style attraverso un meccanismo di routing intelligente e gerarchico di pattern matching.
Sistemi operativi e disponibilità supportati
MUSCLE gira su qualsiasi sistema operativo conforme a POSIX. È distribuito come un unico archivio universale di fonti che consente agli utenti di ottimizzare l'applicazione per il proprio sistema GNU / Linux. Al momento sono supportate entrambe le piattaforme hardware a 32 e 64 bit.
Novità in questa versione:
- test / Makefile-mt non tenta più di compilare testreflectsession tranne quando si esegue su un sistema operativo supportato da testreflectsession.
- Sono state apportate alcune modifiche minori e la ri-organizzazione del & quot; MUSCLE by Example & quot; pagine.
- Sostituito un numero di `tag` in MkDocs con [URL] (...)
- Rimossa l'ereditarietà privata di CountedObject da tutte le classi che lo avevano - ora includono invece una variabile membro privato CountedObject. Ciò è stato fatto solo perché tutta quell'eredità privata stava ingombrando i grafici dell'ereditarietà dell'ossigeno.
- Aggiunta una macro DECLARE_COUNTED_OBJECT a CountedObject.h in modo che qualsiasi potenziale sovraccarico di memoria di CountedObjects possa essere eliminato nei casi in cui il conteggio degli oggetti non è desiderato.
- Rimosso il supporto per -DMUSCLE_AVOID_OBJECT_COUNTING e aggiunto una macro -DMUSCLE_ENABLE_OBJECT_COUNTING al suo posto. (Ovvero, la classe CountedObject ora è disabilitata per default e deve essere esplicitamente abilitata per poterla usare)
- Aggiunto & quot; MUSCLE per esempio & quot; documentazione per MiscUtilityFunctions. {cpp, h}
- Modificato un numero di `tag` nel sorgente MkCm da MUSCLE per esempio in [urls] in modo che i metodi che menzionano possano essere rivisti rapidamente.
- server / Makefile ora specifica libmuscle.a dopo il file main () .o.
- Risolti alcuni avvisi di gcc nella cartella dei test (secondo i suggerimenti di Mika)
- UnparseFile () non stava citando correttamente parole chiave con spazi. Fisso.
- Corrette le dipendenze nel & quot; MUSCLE per Esempio & quot; esempi 'Makefile.
Novità nella versione:
- Aggiunto un metodo di convenienza ShrinkToFit () alla coda, Hashtable, e classi di stringhe. Questo metodo riduce l'oggetto in modo che la quantità di memoria allocata internamente corrisponda alla dimensione dei dati effettivamente contenuti.
- Hashtable :: EnsureSize () e Queue :: EnsureSize () ora accettano un argomento opzionale (allowShrink), che (se impostato su true) consente di riallineare l'array internamente allocato dell'oggetto se è maggiore del necessario.
- Ottimizzato il comportamento di espansione del buffer della classe String per essere un po 'più efficiente.
- Aggiunta una protezione contro una potenziale ricorsione infinita che potrebbe verificarsi durante la registrazione di & quot; OUT OF MEMORY & quot; errore dopo un errore di allocazione della memoria, se un LogCallback ha tentato di allocare memoria.
Novità nella versione 6.01:
- Aggiunto un metodo di convenienza PrependWord () alla classe String.
- Aggiunti i metodi di convenienza WithReplacements () alla classe String.
- Aggiunto un metodo SetExplicitDelayMicros () alla classe DetectNetworkConfigChangesSession.
- Aggiunto un metodo IsCopperDetected () alla classe NetworkInterfaceInfo, in modo che il codice possa stabilire se un jack Ethernet ha un cavo collegato o meno.
- Aggiunto un & quot; quietsend & quot; argomento a hexterm.
- Il metodo virtuale NetworkInterfacesChanged () nella classe DetectNetworkConfigChangesSession è stato modificato per accettare un argomento che richiama in particolare le interfacce di rete modificate. Questa funzionalità è attualmente implementata solo sotto Linux, MacOS / X e Windows. Per gli altri sistemi operativi, l'argomento sarà sempre una lista vuota.
- Risolto un bug nell'implementazione Linux di DetectNetworkConfigChangesSession che poteva causare un errore di segmentazione se recvmsg () restituiva un errore (ad esempio a causa di un segnale ricevuto).
Novità in nella versione 6.00:
- Riscrivi la classe SSLSocketDataIO per funzionare meglio con I / O non bloccanti (in combinazione con la nuova classe SSLSocketAdapterGateway).
- Aggiunte implementazioni di SSLSocketDataIO :: SetPrivateKey () e SSLSocketDataIO :: SetCertificate () che accettano un ByteBuffer come argomento.
- Aggiunta una classe SSLSocketAdapterGateway che viene utilizzata per gestire la macchina di stato interna di OpenSSL quando si utilizza una classe SSLSocketDataIO con il gateway.
- Aggiunti i metodi SetSSLPrivateKey () e GetSSLPrivateKey () alla classe ReflectServer, per abilitare più facilmente l'autenticazione SSL su tutte le connessioni TCP in entrata. Questi metodi sono disponibili se è definito MUSCLE_ENABLE_SSL.
- Aggiunti i metodi SetSSLPublicKeyCertificate () e GetSSLPublicKeyCertificate () alla classe ReflectServer, per facilitare l'attivazione dell'autenticazione SSL sulle connessioni TCP in uscita. Questi metodi sono disponibili se è definito MUSCLE_ENABLE_SSL.
- Aggiunti i metodi SetSSLPrivateKey () e SetSSLPublicKeyCertificate () alla classe MessageTransceiverThread, per facilitare l'attivazione della funzionalità SSL quando si utilizza l'I / O con thread.
- Aggiunta una cartella ssl_data con alcune informazioni sulla generazione di coppie di chiavi pubbliche / private OpenSSL e una coppia di chiavi di esempio da utilizzare nel test di OpenSSL.
- Quando MUSCLE_ENABLE_SSL è definito, muscoloso ora accetta un argomento opzionale 'privatekey = filename'. Quando specificato, la modalità SSL sarà abilitata e muscolosa accetterà solo le connessioni TCP in ingresso che presentano chiavi pubbliche che corrispondono a questa chiave privata / certificato.
- Quando MUSCLE_ENABLE_SSL è definito, portablereflectclient e qt_example accettano ora un argomento opzionale 'publickey = nomefile'. Quando specificato, la modalità SSL verrà abilitata e questi client si collegheranno a muscolosi usando OpenSSL e presenteranno questo file come loro credenziali.
- Aggiunto un & quot; Animazione & quot; checkbox alla demo qt_example. Selezionandolo, la finestra muove automaticamente il suo indicatore. Questo è divertente e utile anche se vuoi testare uno scenario in cui più client generano traffico simultaneamente.
- Crea la demo di qt_example più carina.
- Rinominato le macro di helper C ++ 11 in Hashtable.h e Queue.h per renderle meno soggette a collisione con le macro di altri pacchetti. * Risolti alcuni errori minori nella classe SSLSocketDataIO. o Rinominato SSLSocketDataIO :: SetKey () su SetPrivateKey (). o Rinominato SSLSocketDataIO :: SetCertificate () su SetPublicKeyCertificate (). o AbstractMessageIOGateway :: SetDataIO () è ora un metodo virtuale.
Novità nella versione 5.92:
- Supporto migliorato per la semantica del movimento C ++ 11 nelle classi Queue e Hashtable (abilitato solo quando -DMUSCLE_USE_CPLUSPLUS11 è definito)
- Aggiunti alcuni strumenti alla classe String in modo da poter vedere quante volte un oggetto String viene copiato, spostato, ecc. (abilitato solo quando viene definito -DMUSCLE_COUNT_STRING_COPY_OPERATIONS)
- Aggiunta una funzione PrintAndClearStringCopyCounts () che stamperà i dati relativi alle stringhe raccolti sopra.
- Aggiunto un po 'di magia SFINAE a muscleSwap () in modo che si scambia chiamando SwapContents () quando possibile, piuttosto che copiando su un oggetto temporaneo.
- Aggiunto un costruttore di inizializzatore e sovraccarico di AddTailMulti () alla classe Queue (disponibile solo quando -DMUSCLE_USE_CPLUSPLUS11 è definito, ovviamente)
- Rinominato la coda e gli overload di array di Queue :: AddTail () in AddTailMulti (), per evitare conflitti con il nuovo supporto per l'analisi del template in C ++ 11.
- Rinominato la coda e gli overload di array di Queue :: AddHead () in AddHeadMulti (), per evitare conflitti con il nuovo supporto per l'analisi del template in C ++ 11.
- Sostituita la macro MCRASH_IMPL con una chiamata da asserire (false).
- Un po 'più tweakage per la compatibilità con Android.
- Molti dei programmi nella cartella dei test non venivano compilati in C ++ 11. Fisso.
- Corretti diversi potenziali bug che sono stati rilevati dallo strumento di analisi statica di clang.
Novità nella versione 5.91:
- Aggiunto il metodo di convenienza CleanCanPut () per la classe Hashtable.
- Aggiunto il metodo di convenienza CleanCanAdd () per la classe Queue.
- Modificato DoMutexAtomicIncrement () come funzione inline per rendere più efficiente la chiamata.
- Modificato QMessageTransceiverThread e QAcceptSocketsThread per chiamare QCoreApplication :: postEvent () anziché QApplication :: postEvent (), per consentire app Qt non-GUI.
- Aggiornamento del documento Guida per principianti per riflettere il miglior supporto UDP di MUSCLE.
- Unita in alcune modifiche di compatibilità Android fornite da Jean-François Mullet.
- L'utilizzo del flag di compilazione MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS causerebbe il blocco di MUSCLE all'avvio a causa di un problema di ordine delle operazioni. Questo è stato risolto ora.
- Il flag di compilazione MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS è stato precedentemente utilizzato solo se non era disponibile un'altra implementazione di AtomicCounter. Ora il flag ha precedenza più alta, quindi impostando il flag significa che verranno utilizzati i mutex, anche se è disponibile un altro meccanismo (più efficiente).
Novità in nella versione 5.90:
- Aggiunto un metodo GetPacketMaximumSize () alla classe DataIO per consentire al codice gateway di gestire in modo più intelligente le comunicazioni pacchettizzate in stile UDP.
- MessageIOGateway ora funziona utilmente in combinazione con UDPSocketDataIO.
- Aggiunte le funzioni di tipo CreateObjectFromArchiveMessage () a Message.h, per fungere da controparte lato ripristino di GetArchiveMessageFromPool (), ecc.
- AtomicCounter :: AtomicIncrement () ora restituisce un valore booleano (true se il nuovo valore del contatore è uguale a uno).
- Modificata la classe HashtableIterator in modo che le iterazioni di Hashtable di sola lettura siano ora thread-safe anche se il flag HTIT_FLAG_NOREGISTER non è specificato.
- Aggiunta una classe muscle_thread_id a SetupSystem.h, per rappresentare correttamente un ID di thread in modo neutrale all'implementazione.
- Aggiunto un & quot; deadlock & quot; programma nella cartella test. Questo programma rischia deliberatamente di creare un deadlock, come un modo per esercitare / dimostrare il test del deadlockfinder.
- Aggiunto supporto per un flag della riga di comando -DMUSCLE_AVOID_THREAD_SAFE_HASHTABLE_ITERATORS, per coloro che preferiscono evitare il sovraccarico della sicurezza del thread automatico e promettono di fornire manualmente gli argomenti HTIT_FLAG_NOREGISTER dove necessario.
- Aggiunta una cache di ricerca LRU opzionale alla funzione GetHostByName (), in modo che possa tornare più rapidamente quando gli stessi nomi host vengono risolti più e più volte.
- Aggiunta una funzione SetHostNameCacheSettings () che abilita e regola la cache di ricerca LRU in GetHostByName ().
- Aggiunto supporto per & quot; dnscache & quot; e & quot; dnscachesize & quot; argomenti della riga di comando in HandleStandardDaemonArgs (), per consentire la specifica della riga di comando del comportamento della cache di ricerca LRU.
- Modificata la classe Hashtable in modo che i valori dei membri _iterHead, _iterTail e _freeHead ora siano uint32 anziché puntatori, per ridurre l'utilizzo della memoria.
- Rimosso il metodo ThreadLocalStorage :: SetFreeHeldObjectsOnExit () e aggiunto un argomento booleano al suo costruttore, poiché i pthreads non ti permettono di cambiare quell'impostazione dopo che è stato chiamato pthread_key_create ().
- Spostato GetCurrentThreadID () nella classe muscle_thread_id come funzione membro statico e modificato per restituire un oggetto muscle_thread_id piuttosto che unsigned long.
- Modificato il nome host predefinito per le sessioni senza un indirizzo IP noto da & quot; & quot; a & quot; _unknown_ & quot ;, poiché le parentesi angolari nella precedente stringa hanno un significato speciale a partire dalla versione 5.84, e questo potrebbe interferire con la corrispondenza del percorso del nodo in modi involontari.
- I metodi CalculateChecksum () in Message.cpp sono stati modificati per essere più affidabili nel rilevamento delle differenze di trasposizione dei dati.
- Rimosso il supporto MUSCLE_USE_QT_FOR_ATOMIC_OPERATIONS da AtomicCounter.h, poiché la classe QAtomicInt di Qt non supporta la funzionalità richiesta dal nuovo valore di ritorno del metodo AtomicIncrement ().
- Removed MessageIOGateway :: FlattenMessage () e MessageIOGateway :: UnflattenMessage (). Aggiunti al loro posto: MessageIOGateway :: FlattenHeaderAndMessage () e MessageIOGateway :: UnflattenHeaderAndMessage (). Questi nuovi metodi gestiscono contemporaneamente sia i byte di intestazione che il corpo del messaggio.
- Aggiunto un file udpproxy.vcproj alla cartella tests, per aiutare a compilare udpproxy sotto Windows.
- Messaggio: Flatten () ora scorre i campi del messaggio una volta, invece di due volte.
- GetCurrentThreadID () ora è una funzione inline, dal momento che ora può essere chiamata spesso da HashtableIterator.
- Modificato il codice del deadlockfinder per usare Code invece di Hashtables, poiché muscle_thread_id non può più essere usato come un tipo di chiave Hashtable.
- Risolto testudp.cpp per utilizzare correttamente MessageIOGateway per la sua comunicazione UDP.
- Ottimizzato gli ifdefs in FilePathInfo.cpp un po 'di più in modo che statInfo.st_birthtimespec non sia accessibile quando si utilizzano gli SDK MacOS / X che non lo forniscono.
- MessageDataIOGateway non tenta più di svincolare un messaggio da un buffer di dati deflazionato con zlib che non è stato in grado di rigonfiare.
- Risolto un bug in SendDataUDP () che poteva causare a SendDataUDP () di restituire erroneamente un errore quando si inviava a un indirizzo multicast usando la modalità non bloccante e il buffer di output era pieno.
Novità nella versione 5.85:
- Aggiunte le chiamate LogTime (MUSCLE_LOG_DEBUG) a tutti i percorsi di errore in MessageIOGateway :: DoInputImplementation () e Message :: Unflatten (), in modo che sia più facile determinare quando le connessioni TCP vengono interrotte a causa dei dati la corruzione.
- Aggiunta una funzione PreviousOperationHadTransientFailure (), che restituisce true se f errno è EINTR o ENOBUFS.
- La specifica di spamspersecond = -1 farà ora sì che hexterm invii i dati spam il più velocemente possibile.
- L'implementazione MUSCLE_USE_POLL di SocketMultiplexer.h stava fornendo POLLERR a WSAPoll () ma WSAPoll () non supporta POLLERR quindi WSAPoll () restituirebbe un errore quando ciò si verificava. Ha risolto il problema filtrando POLLERR durante la compilazione in Windows.
- Risolto un bug in cui send () restituendo ENOBUFS poteva causare la chiusura della connessione socket, anche se ENOBUFS non era una condizione fatale.
- SocketMultiplexer.cpp non verrebbe compilato quando MUSCLE_USE_POLL è stato definito. Fisso.
- Il metodo ZLibCodec :: Deflate () non riuscirebbe a comprimere tutti i dati in un buffer molto grande (ad esempio oltre 42 MB). Fisso.
Novità nella versione 5.84:
- La sintassi dell'intervallo numerico della classe StringMatcher è stata estesa in modo da poter specificare più intervalli. Ad esempio, & quot; & quot; corrisponderebbe alle stringhe "19", "20", "21", "25", "30", "31", [...] e & quot; 50 & quot;.
- Aggiunte le funzioni di conversione GetCurrentTime64ForRunTime64 () e GetRunTime64ForCurrenTime64 () a TimeUtilityFunctions.h.
- Aggiunto un metodo di utilità GetDescendant () alla classe DataNode.
- Aggiunti i costruttori di movimento C ++ 11 e gli operatori spostamento-assegnazione alle classi Hashtable, Queue, String, Message e ByteBuffer. Per compatibilità con i vecchi compilatori, questo codice verrà compilato solo se -DMUSCLE_USE_CPLUSPLUS11 è specificato sulla riga di compilazione.
- La classe SharedMemory ora eseguirà il nerf stesso in una classe di memoria non condivisa se è specificato -DMUSCLE_FAKE_SHARED_MEMORY.
- Aggiunto un test testfilepathinfo alla cartella test.
- Aggiornate tutte le intestazioni degli avvisi di copyright per leggere il suono Meyer 2000-2013.
- Aggiunti spazi tra token macro (ad esempio UINT32_FORMAT_SPEC) e costanti di stringa (ad es. & quot; Hello & quot;) per rendere felici i compilatori C ++ 11.
- ByteBuffer.cpp aveva un errore di sintassi che impediva la compilazione su host big-endian. Fisso.
- Solo MacOS / X: sostituite chiamate di funzioni di carbone deprecate con equivalenti Mach, per evitare avvisi di deprecazione sotto 10.8.x.
Novità nella versione 5.83:
- Aggiunte versioni convenienti di InflateByteBuffer () e DeflateByteBuffer () che prendi un ByteBufferRef come argomento.
- Rimossi alcuni metodi obsoleti / non utilizzati (EnsureBufferSize () e FreeLargeBuffer ()) dalla classe AbstractMessageIOGateway.
- Corretti alcuni refusi nei commenti nella sottocartella delphi.
- La classe Hashtable non genera più avvisi quando è compilata in MSVC con -DMUSCLE_AVOID_MINIMIZED_HASHTABLES definito.
- Risolto un bug in IPAddressAndPort :: ToString () che causava la formattazione ambigua delle stringhe degli indirizzi IPv4 quando (preferIPv4Style) era impostato su false.
I commenti non trovato