MUSCLE 代表多用戶服務器客戶端鏈接環境,它是一個開源,免費,強大,可擴展和跨平台的郵件系統,由服務器和客戶端組件組成。它將幫助您編寫各種分佈式軟件,從多人遊戲和IRC聊天客戶端到SETI計算應用程序。
功能一目了然
通過MUSCLE,用戶可以通過定義自己的會話邏輯或消息流協議輕鬆自定義包含的“肌肉服務器”。該軟件可幫助您使用C ++,C,C#,Java,Delphi或Python編程語言編寫客戶端代碼。
該程序使用類似BMessage的肌肉::消息,支持發送扁平肌肉::通過TCP(傳輸控制協議)流在計算機之間發送消息,部署“肌肉發達的服務器””在服務器計算機上,允許您編寫可用於與服務器通信的客戶端程序。
此外,它還包括支持所有上述編程語言的單線程和多線程消息傳遞API。 “肌肉發達的服務器”&ndquo;可以通過定義消息流協議或會話邏輯輕鬆定制。
MUSCLE入門
成功登錄後,客戶端程序可以確定還有誰登錄到中央服務器,以及將肌肉::消息存儲在RAM(系統內存)中並將肌肉::消息發送到連接的其他客戶端到服務器。請注意,客戶端程序可以訂閱服務器上的特定數據,並在數據更改時立即收到通知。
支持各種消息路由
該軟件旨在通過智能的分層模式匹配路由機制支持各種消息路由,包括單播風格,廣播風格和多播風格路由。
支持的操作系統和可用性
MUSCLE可在任何符合POSIX標準的操作系統上運行。它作為單個通用源存檔分發,允許用戶優化GNU / Linux系統的應用程序。目前支持32位和64位硬件平台。
此版本中的新功能:
- tests / Makefile-mt不再嘗試編譯testreflectsession,除非在testreflectsession支持的操作系統上執行。
- 做了一些小的編輯和重新安排“按例子的肌肉”。頁。
- 用[URL](...)替換MkDocs中的多個`tags`
- 從具有它的所有類中刪除了CountedObject的私有繼承 - 現在它們包含一個CountedObject私有成員變量。這樣做只是因為所有私有繼承都混淆了DOxygen繼承圖。
- 在CountedObject.h中添加了一個DECLARE_COUNTED_OBJECT宏,以便在不需要對象計數的情況下,可以消除CountedObjects的任何潛在內存開銷。
- 刪除了對-DMUSCLE_AVOID_OBJECT_COUNTING的支持,並在其位置添加了-DMUSCLE_ENABLE_OBJECT_COUNTING宏。 (也就是說,現在已禁用CountedObject類 - 默認情況下必須顯式啟用它才能使用它)。
- 添加“按實例分類的肌肉” MiscUtilityFunctions的文檔。{cpp,h}
- 將MUSCLE-by-Example MkDocs源中的多個`tags`更改為[urls],以便快速查看他們提到的方法。
- server / Makefile現在指定main().o文件後面的libmuscle.a。
- 修復了測試文件夾中的一些gcc警告(根據Mika的建議)
- UnparseFile()沒有正確引用帶空格的關鍵字。固定的。
- 修復了“MUSCLE by Example”中的依賴關係。示例'Makefiles。
版本中的新內容:
- 為Queue,Hashtable添加了一個ShrinkToFit()方便方法,和String類。此方法縮小對象,以便內部分配的內存量與實際保存的數據大小相匹配。
- Hashtable :: EnsureSize()和Queue :: EnsureSize()現在採用可選(allowShrink)參數,如果設置為true,則允許對象的內部分配數組在大於必要時重新分配。
- 調整String類的緩衝區擴展行為以提高效率。
- 添加了防止在記錄“OUT OF MEMORY”時可能發生的潛在無限遞歸的警告。內存分配失敗後出現錯誤,如果LogCallback嘗試分配內存。
版本6.01中的新功能:
- 為String類添加了一個PrependWord()方便方法。
- 為String類添加了WithReplacements()便捷方法。
- 為DetectNetworkConfigChangesSession類添加了SetExplicitDelayMicros()方法。
- 在NetworkInterfaceInfo類中添加了一個IsCopperDetected()方法,以便代碼可以判斷以太網插孔是否插有電纜。
- 添加了“quietsend”對hexterm的爭論。
- DetectNetworkConfigChangesSession類中的NetworkInterfacesChanged()虛方法已更改為接受一個參數,該參數調出特定的網絡接口已更改。此功能目前僅在Linux,MacOS / X和Windows下實現。對於其他操作系統,參數將始終為空列表。
- 修復了DetectNetworkConfigChangesSession的Linux實現中的一個錯誤,如果recvmsg()返回錯誤(例如由於收到信號),可能會導致分段錯誤。
版本6.00中的新功能:
- 重寫了SSLSocketDataIO類,以便更好地使用非阻塞I / O(與新的SSLSocketAdapterGateway類結合使用)。
- 添加了以ByteBuffer作為參數的SSLSocketDataIO :: SetPrivateKey()和SSLSocketDataIO :: SetCertificate()的實現。
- 添加了一個SSLSocketAdapterGateway類,用於在網關中使用SSLSocketDataIO類時管理OpenSSL的內部狀態機。
- 為ReflectServer類添加了SetSSLPrivateKey()和GetSSLPrivateKey()方法,以便在所有傳入的TCP連接上更輕鬆地啟用SSL身份驗證。如果定義了MUSCLE_ENABLE_SSL,則可以使用這些方法。
- 為ReflectServer類添加了SetSSLPublicKeyCertificate()和GetSSLPublicKeyCertificate()方法,以便更輕鬆地在傳出TCP連接上啟用SSL身份驗證。如果定義了MUSCLE_ENABLE_SSL,則可以使用這些方法。
- 將SetSSLPrivateKey()和SetSSLPublicKeyCertificate()方法添加到MessageTransceiverThread類,以便在使用線程I / O時更輕鬆地啟用SSL功能。
- 添加了一個ssl_data文件夾,其中包含有關生成OpenSSL公鑰/私鑰對的一些信息,以及用於測試OpenSSL的示例密鑰對。
- 當定義了MUSCLE_ENABLE_SSL時,肌肉現在接受一個可選的'privatekey = filename'參數。指定後,將啟用SSL模式,肌肉模式將僅接受提供與此私鑰/證書匹配的公鑰的傳入TCP連接。
- 當定義了MUSCLE_ENABLE_SSL時,portablereflectclient和qt_example現在將接受可選的'publickey = filename'參數。指定後,將啟用SSL模式,這些客戶端將使用OpenSSL連接到肌肉,並將此文件作為其憑據提供。
- 添加了“Animate” qt_example演示的複選框。檢查它會導致窗口自動移動其指示器。如果您想測試多個客戶端同時生成流量的方案,這很有趣也很有用。
- 讓qt_example演示更漂亮。
- 在Hashtable.h和Queue.h中重命名了C ++ 11-helper宏,使它們不太可能與其他包的宏發生衝突。 *修復了SSLSocketDataIO類中的一些小錯誤。 o將SSLSocketDataIO :: SetKey()重命名為SetPrivateKey()。 o將SSLSocketDataIO :: SetCertificate()重命名為SetPublicKeyCertificate()。 o AbstractMessageIOGateway :: SetDataIO()現在是一個虛方法。 版本5.92中的
什麼是新的:
- 改進了對Queue和Hashtable類中C ++ 11移動語義的支持(僅在定義了-DMUSCLE_USE_CPLUSPLUS11時啟用)
- 在String類中添加了一些檢測,以便我可以查看String對像被複製,移動等的次數(僅在定義了-DMUSCLE_COUNT_STRING_COPY_OPERATIONS時啟用)
- 添加了PrintAndClearStringCopyCounts()函數,該函數將打印出上面收集的字符串操作數據。
- 為muscleSwap()添加了一些SFINAE魔法,以便在可能的情況下通過調用SwapContents()進行交換,而不是複製到臨時對象。
- 添加了一個初始化列表構造函數和AddTailMulti()重載到Queue類(當然,只有在定義了-DMUSCLE_USE_CPLUSPLUS11時才可用)
- 將Queue :: AddTail()的隊列和數組重載重命名為AddTailMulti(),以避免與新的C ++ 11模板解析支持衝突。
- 將Queue :: AddHead()的Queue和數組重載重命名為AddHeadMulti(),以避免與新的C ++ 11模板解析支持衝突。
- 通過調用assert(false)替換MCRASH_IMPL宏。
- 更多Android兼容性調整。
- tests文件夾中的許多程序都沒有在C ++ 11下編譯。固定的。
- 修復了clang靜態分析工具檢測到的幾個潛在錯誤。
版本5.91中的新功能:
- 為Hashtable類添加了EnsureCanPut()便捷方法。
- 為Queue類添加了EnsureCanAdd()便捷方法。
- 將DoMutexAtomicIncrement()更改為內聯函數,以使其更有效。
- 更改了QMessageTransceiverThread和QAcceptSocketsThread以調用QCoreApplication :: postEvent()而不是QApplication :: postEvent(),以允許非GUI Qt應用程序。
- 更新了初學者指南文檔,以反映MUSCLE改進的UDP支持。
- 合併了Jean-FranA§oisMullet提供的一些Android兼容性更改。
- 由於操作順序問題,使用MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS編譯標誌會導致MUSCLE在啟動時崩潰。現在已經解決了這個問題。
- 以前只有在沒有其他AtomicCounter實現可用時才使用MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS編譯標誌。現在該標誌具有更高的優先級,因此設置該標誌意味著將使用互斥鎖,即使有另一種(更有效的)機制可用。
版本5.90中的新功能:
- 向DataIO類添加了一個GetPacketMaximumSize()方法,以允許網關代碼更智能地處理UDP樣式的分組通信。
- MessageIOGateway現在可以與UDPSocketDataIO結合使用。
- 為Message.h添加了CreateObjectFromArchiveMessage()模板化函數,作為GetArchiveMessageFromPool()等的恢復端對應物。
- AtomicCounter :: AtomicIncrement()現在返回一個布爾值(如果新計數器值等於1,則為true)。
- 修改了HashtableIterator類,以便即使沒有指定HTIT_FLAG_NOREGISTER標誌,只讀Hashtable迭代現在也是線程安全的。
- 在SetupSystem.h中添加了一個muscle_thread_id類,以實現中立的方式正確表示線程ID。
- 添加了“死鎖”程序到測試文件夾。該程序故意冒著造成僵局的風險,作為鍛煉/展示死鎖定試驗的一種方式。
- 添加了對-DMUSCLE_AVOID_THREAD_SAFE_HASHTABLE_ITERATORS命令行標誌的支持,適用於那些寧願避免自動線程安全開銷並承諾在必要時手動提供HTIT_FLAG_NOREGISTER參數的人。
- 為GetHostByName()函數添加了一個可選的LRU查找緩存,以便在反复解析相同的主機名時它可以更快地返回。
- 添加了一個SetHostNameCacheSettings()函數,用於在GetHostByName()中啟用和調整LRU查找緩存。
- 添加了對“dnscache”的支持和“dnscachesize” HandleStandardDaemonArgs()中的命令行參數,以允許命令行指定LRU查找緩存的行為。
- 修改了Hashtable類,以便_iterHead,_iterTail和_freeHead成員值現在是uint32s而不是指針,以減少內存使用量。
- 刪除了ThreadLocalStorage :: SetFreeHeldObjectsOnExit()方法,並在其構造函數中添加了一個布爾參數,因為pthreads不允許在調用pthread_key_create()之後更改該設置。
- 將GetCurrentThreadID()作為靜態成員函數移動到muscle_thread_id類中,並將其更改為返回一個muscle_thread_id對象而不是unsigned long。
- 更改了“"”中沒有已知IP地址的會話的默認主機名。到“_unknown_”,因為前一個字符串中的尖括號在5.84版本中具有特殊含義,並且可能以非預期的方式乾擾節點路徑匹配。
- Message.cpp中的CalculateChecksum()方法已被修改為在檢測數據轉置差異方面更加健壯。
- 從AtomicCounter.h中刪除了MUSCLE_USE_QT_FOR_ATOMIC_OPERATIONS支持,因為Qt的QAtomicInt類不支持AtomicIncrement()方法的新返回值所需的功能。
- 刪除了MessageIOGateway :: FlattenMessage()和MessageIOGateway :: UnflattenMessage()。在他們的位置添加:MessageIOGateway :: FlattenHeaderAndMessage()和MessageIOGateway :: UnflattenHeaderAndMessage()。這些新方法同時處理頭字節和消息體。
- 在tests文件夾中添加了一個udpproxy.vcproj文件,以幫助在Windows下編譯udpproxy。
- 消息:Flatten()現在迭代消息中的字段一次,而不是兩次。
- GetCurrentThreadID()現在是一個內聯函數,因為它現在可能經常被HashtableIterator調用。
- 修改deadlockfinder代碼以使用Queues而不是Hashtables,因為muscle_thread_id不能再用作Hashtable鍵類型。
- 修復了testudp.cpp以正確使用MessageIOGateway進行UDP通信。
- 稍微調整FilePathInfo.cpp中的ifdef,以便在使用不提供它的MacOS / X SDK時不會訪問statInfo.st_birthtimespec。
- MessageDataIOGateway不再嘗試從無法重新充氣的zlib-deflated數據緩衝區中取消消息。
- 修復了SendDataUDP()中的一個錯誤,該錯誤可能導致SendDataUDP()在使用非阻塞模式發送到多播地址時錯誤地返回錯誤,並且輸出緩衝區已滿。
版本5.85中的新功能:
- 對MessageIOGateway :: DoInputImplementation()和Message :: Unflatten()中的所有錯誤路徑添加了LogTime(MUSCLE_LOG_DEBUG)調用,以便更容易確定TCP連接何時因數據而中止損壞。
- 添加了PreviousOperationHadTransientFailure()函數,該函數返回true iff errno是EINTR或ENOBUFS。
- 指定spamspersecond = -1現在會導致hexterm盡快發送垃圾郵件數據。
- SocketMultiplexer.h的MUSCLE_USE_POLL實現正在向WSAPoll()提供POLLERR,但WSAPoll()不支持POLLERR,因此WSAPoll()會在發生這種情況時返回錯誤。在Windows下編譯時過濾掉POLLERR,解決了這個問題。
- 修復了返回ENOBUFS的send()可能導致套接字連接被終止的錯誤,即使ENOBUFS不是致命的情況。
- 定義MUSCLE_USE_POLL時,SocketMultiplexer.cpp無法編譯。固定的。
- ZLibCodec :: Deflate()方法無法壓縮非常大的緩衝區中的所有數據(例如超過42MB)。固定的。
版本5.84中的新功能:
- StringMatcher類的數值範圍語法已擴展,現在您可以指定多個範圍。例如,“”將匹配字符串“19”,“20”,“21”,“25”,“30”,“31”,[...]和“50”。
- 將GetCurrentTime64ForRunTime64()和GetRunTime64ForCurrenTime64()轉換函數添加到TimeUtilityFunctions.h。
- 向DataNode類添加了GetDescendant()實用程序方法。
- 將C ++ 11 move-constructors和move-assignment-operators添加到Hashtable,Queue,String,Message和ByteBuffer類中。為了向後兼容舊編譯器,只有在編譯行中指定了-DMUSCLE_USE_CPLUSPLUS11時才會編譯此代碼。
- 如果指定了-DMUSCLE_FAKE_SHARED_MEMORY,則SharedMemory類現在將自身綁定到非共享內存類中。
- 在tests文件夾中添加了testfilepathinfo測試。
- 更新了所有版權聲明標題,以閱讀2000-2013 Meyer Sound。
- 在宏令牌(例如UINT32_FORMAT_SPEC)和字符串常量(例如“Hello”)之間添加了空格,以使C ++ 11編譯器滿意。
- ByteBuffer.cpp的語法錯誤會阻止它在big-endian主機上進行編譯。固定的。
- 僅適用於MacOS / X:使用Mach等效替換已棄用的Carbon函數調用,以避免10.8.x下的棄用警告。
版本5.83中的新功能:
- 添加了InflateByteBuffer()和DeflateByteBuffer()的便利版本將ByteBufferRef作為參數。
- 從AbstractMessageIOGateway類中刪除了一些過時/未使用的方法(EnsureBufferSize()和FreeLargeBuffer())。
- 修正了delphi子文件夾中註釋中的一些拼寫錯誤。
- 在MSVC下編譯並且定義了-DMUSCLE_AVOID_MINIMIZED_HASHTABLES時,Hashtable類不再生成警告。
- 修正了IPAddressAndPort :: ToString()中的一個錯誤,當(preferIPv4Style)設置為false時,導致IPv4地址字符串被格式化。
評論沒有發現