diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 425e00c6091703fbecea5ab78420e984d8efca7a..561a70d9fb2b18f005fc1b459907d93469ed00ca 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -712,7 +712,9 @@ static bool SocketRecvHandle(int socketId, std::pair &, } return true; } - + if (callback.GetEventManager && !callback.GetEventManager()->GetContextState()) { + return false; // close fd 后 客户端socket read区被丢弃, 不走OnMessage处理 + } void *data = malloc(recvLen); if (data == nullptr) { callback.OnError(NO_MEMORY); @@ -1258,6 +1260,7 @@ bool ExecClose(CloseContext *context) inst->Close(); } } + manager->SetContextState(false); // 加锁前先置close标志位,防止socket流发生close后仍在接收数据 std::unique_lock lock(manager->GetDataMutex()); if (context->GetSocketFd() < 0) { NETSTACK_LOGE("sock %{public}d is previous closed", context->GetSocketFd()); diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index a35aebc63cb426d532ce128575733619108a3d68..4e7b6b12c36bfc198f1d4908fb8eb14e623b60ca 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -113,6 +113,10 @@ public: void SetReuseAddr(bool reuse); + void SetContextState(bool enable); + + bool GetContextState(); + void SetWebSocketUserData(const std::shared_ptr &userData); std::shared_ptr GetWebSocketUserData(); diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index 5da8baa9b59342a3bc426b44d5aff5e27b620203..57ec08f6114a46c91b36495ae2e482c3e7091d64 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -358,6 +358,16 @@ bool EventManager::GetReuseAddr() return isReuseAddr_.load(); } +void EventManager::SetContextState(bool enable) +{ + isOpened_ = enable; +} + +bool EventManager::GetContextState() +{ + return isOpened_; +} + std::shared_ptr EventManager::GetProxyData() { return proxyData_;