From 1fda2c38392f81d1b40474dc20621314de015a73 Mon Sep 17 00:00:00 2001 From: hui1975 Date: Tue, 27 Sep 2022 16:41:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9socket=E7=9A=84recv=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hui1975 Change-Id: Ibb9d85a99962ebc53c69084e0bee384ffca9cba1 --- .../include/sensor_file_descriptor_listener.h | 2 +- .../src/sensor_file_descriptor_listener.cpp | 82 +++++++++++-------- utils/src/sensor_basic_data_channel.cpp | 6 +- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/frameworks/native/sensor/include/sensor_file_descriptor_listener.h b/frameworks/native/sensor/include/sensor_file_descriptor_listener.h index 165ba763..68361ebe 100644 --- a/frameworks/native/sensor/include/sensor_file_descriptor_listener.h +++ b/frameworks/native/sensor/include/sensor_file_descriptor_listener.h @@ -34,8 +34,8 @@ public: void SetChannel(SensorDataChannel* channel); private: + int32_t ReceiveData(int32_t fileDescriptor, void *vaddr, size_t size); SensorDataChannel* channel_; - TransferSensorEvents *receiveDataBuff_ = nullptr; }; } // namespace Sensors } // namespace OHOS diff --git a/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp b/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp index 8dc13614..97f5250e 100644 --- a/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp +++ b/frameworks/native/sensor/src/sensor_file_descriptor_listener.cpp @@ -27,53 +27,73 @@ using namespace OHOS::AppExecFwk; namespace { constexpr HiLogLabel LABEL = { LOG_CORE, SENSOR_LOG_DOMAIN, "SensorFileDescriptorListener" }; constexpr int32_t RECEIVE_DATA_SIZE = 100; +constexpr int32_t MAX_RETRY_NUMBER = 32; } // namespace SensorFileDescriptorListener::SensorFileDescriptorListener() { channel_ = nullptr; - receiveDataBuff_ = - new (std::nothrow) TransferSensorEvents[sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE]; - CHKPL(receiveDataBuff_); } SensorFileDescriptorListener::~SensorFileDescriptorListener() { CALL_LOG_ENTER; - if (receiveDataBuff_ != nullptr) { - delete[] receiveDataBuff_; - receiveDataBuff_ = nullptr; +} + +int32_t SensorFileDescriptorListener::ReceiveData(int32_t fileDescriptor, void *vaddr, size_t size) +{ + if (fileDescriptor < 0 || vaddr == nullptr) { + SEN_HILOGE("Invalid fileDescriptor or vaddr is null, fileDescriptor:%{public}d", fileDescriptor); + return 0; + } + ssize_t length = 0; + int32_t retryNumber = 0; + while (true) { + ssize_t curLength = recv(fileDescriptor, vaddr, size, MSG_DONTWAIT | MSG_NOSIGNAL); + if (curLength > 0) { + length += curLength; + } else if (curLength < 0) { + if (retryNumber < MAX_RETRY_NUMBER && (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK)) { + SEN_HILOGE("Need retry, errno is EAGAIN|EINTR|EWOULDBLOCK, curLength:%{public}zu, errno:%{public}d", + curLength, errno); + retryNumber++; + continue; + } + SEN_HILOGE("Recv return error, curLength:%{public}zu, errno:%{public}d", curLength, errno); + break; + } else { + SEN_HILOGE("curLength:0, errno:%{public}d", errno); + break; + } + if (curLength < size) { + break; + } } + return length; } void SensorFileDescriptorListener::OnReadable(int32_t fileDescriptor) { if (fileDescriptor < 0) { - SEN_HILOGE("fileDescriptor:%{public}d", fileDescriptor); + SEN_HILOGE("Invalid fileDescriptor:%{public}d", fileDescriptor); return; } FileDescriptorListener::OnReadable(fileDescriptor); - if (receiveDataBuff_ == nullptr) { - return; - } - int32_t len = - recv(fileDescriptor, receiveDataBuff_, sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE, 0); + TransferSensorEvents receiveDataBuff[RECEIVE_DATA_SIZE] = {}; + int32_t len = ReceiveData(fileDescriptor, receiveDataBuff, sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE); int32_t eventSize = static_cast(sizeof(TransferSensorEvents)); - while (len > 0) { - int32_t num = len / eventSize; - for (int i = 0; i < num; i++) { - SensorEvent event = { - .sensorTypeId = receiveDataBuff_[i].sensorTypeId, - .version = receiveDataBuff_[i].version, - .timestamp = receiveDataBuff_[i].timestamp, - .option = receiveDataBuff_[i].option, - .mode = receiveDataBuff_[i].mode, - .data = receiveDataBuff_[i].data, - .dataLen = receiveDataBuff_[i].dataLen - }; - channel_->dataCB_(&event, 1, channel_->privateData_); - } - len = recv(fileDescriptor, receiveDataBuff_, sizeof(TransferSensorEvents) * RECEIVE_DATA_SIZE, 0); + int32_t num = len / eventSize; + for (int i = 0; i < num; i++) { + SensorEvent event = { + .sensorTypeId = receiveDataBuff[i].sensorTypeId, + .version = receiveDataBuff[i].version, + .timestamp = receiveDataBuff[i].timestamp, + .option = receiveDataBuff[i].option, + .mode = receiveDataBuff[i].mode, + .data = receiveDataBuff[i].data, + .dataLen = receiveDataBuff[i].dataLen + }; + channel_->dataCB_(&event, 1, channel_->privateData_); } } @@ -90,10 +110,6 @@ void SensorFileDescriptorListener::OnShutdown(int32_t fileDescriptor) SEN_HILOGE("param is error:%{public}d", fileDescriptor); } FileDescriptorListener::OnShutdown(fileDescriptor); - if (receiveDataBuff_ != nullptr) { - delete[] receiveDataBuff_; - receiveDataBuff_ = nullptr; - } } void SensorFileDescriptorListener::OnException(int32_t fileDescriptor) @@ -103,10 +119,6 @@ void SensorFileDescriptorListener::OnException(int32_t fileDescriptor) return; } FileDescriptorListener::OnException(fileDescriptor); - if (receiveDataBuff_ != nullptr) { - delete[] receiveDataBuff_; - receiveDataBuff_ = nullptr; - } } } // namespace Sensors } // namespace OHOS \ No newline at end of file diff --git a/utils/src/sensor_basic_data_channel.cpp b/utils/src/sensor_basic_data_channel.cpp index 0e7ef077..f93878f2 100755 --- a/utils/src/sensor_basic_data_channel.cpp +++ b/utils/src/sensor_basic_data_channel.cpp @@ -28,7 +28,7 @@ using namespace OHOS::HiviewDFX; namespace { constexpr HiLogLabel LABEL = { LOG_CORE, SENSOR_LOG_DOMAIN, "SensorBasicChannel" }; -constexpr int32_t SENSOR_READ_DATA_SIZE = sizeof(SensorEvent) * 100; +constexpr int32_t SENSOR_READ_DATA_SIZE = sizeof(TransferSensorEvents) * 100; constexpr int32_t DEFAULT_CHANNEL_SIZE = 2 * 1024; constexpr int32_t SOCKET_PAIR_SIZE = 2; } // namespace @@ -174,6 +174,10 @@ int32_t SensorBasicDataChannel::ReceiveData(void *vaddr, size_t size) do { length = recv(receiveFd_, vaddr, size, MSG_DONTWAIT); } while (errno == EINTR); + if (length < 0) { + SEN_HILOGE("length:%{public}zu, errno:%{public}d", length, errno); + return 0; + } return length; } -- Gitee