diff --git a/server/server.cpp b/server/server.cpp
index 155c155..721397d 100644
--- a/server/server.cpp
+++ b/server/server.cpp
@@ -190,16 +190,26 @@ void CTcpServer::accept_client()
         if (!error) {
             auto endpoint = socket->remote_endpoint();
             std::string client_key = endpoint.address().to_string() + ":" + std::to_string(endpoint.port());
-            logger_->info("New connection from {}", client_key);
 
+            bool can = false;
             {
                 std::lock_guard<std::mutex> lock(cli_mut_);
-                auto cache = std::make_shared<ClientCache>();
-                cache->socket_ = socket;
-                client_map_[client_key] = cache;
+                if (client_map_.size() >= 100) {
+                    logger_->info("Max client connections reached. Closing connection from {}", client_key);
+                    socket->close();
+                } else {
+                    logger_->info("New connection from {}", client_key);
+                    auto cache = std::make_shared<ClientCache>();
+                    cache->socket_ = socket;
+                    client_map_[client_key] = cache;
+                    can = true;
+                }
+            }
+            if (can == false) {
+                std::this_thread::sleep_for(std::chrono::minutes(1));
+            } else {
+                client_threads_[client_key] = std::thread(&CTcpServer::th_client, this, socket, client_key);
             }
-
-            client_threads_[client_key] = std::thread(&CTcpServer::th_client, this, socket, client_key);
         }
         accept_client();
     });
diff --git a/util/util.cpp b/util/util.cpp
index 296dcba..b39bf83 100644
--- a/util/util.cpp
+++ b/util/util.cpp
@@ -1,5 +1,6 @@
 #include "util.h"
 #include <cstdint>
+#include <thread>
 
 std::shared_ptr<spdlog::logger> get_logger(const std::string& mark, const std::string& log_file)
 {
@@ -42,6 +43,14 @@ CFrameBuffer* CTransProtocal::parse(CMutBuffer& buffer)
     unsigned char header[] = {0xFF, 0xFE};
     unsigned char tail[] = {0xFF, 0xFF};
 
+    // 如果超出 1MB的内容都无法解析成功,则认为是有无效客户端参与链接。
+    if (buffer.get_len() > MAX_FRAME_SIZE) {
+        buffer.clear();
+        // 这里故意延迟。
+        std::this_thread::sleep_for(std::chrono::seconds(600));
+        return result;
+    }
+
     int find = buffer.index_of((const char*)header, sizeof(header));
     if (find < 0) {
         return result;
diff --git a/util/util.h b/util/util.h
index e24c38c..116ea8e 100644
--- a/util/util.h
+++ b/util/util.h
@@ -6,7 +6,8 @@
 #include <spdlog/sinks/stdout_color_sinks.h>
 #include <spdlog/spdlog.h>
 
-constexpr int g_BuffSize = 102400;
+constexpr size_t g_BuffSize = 102400;
+const size_t MAX_FRAME_SIZE = 10 * g_BuffSize;
 enum FrameType : int16_t {
     TYPE_DEFAULT = 0,
     TYPE_GET_LIST,