diff --git a/include/neuron/connection/neu_connection.h b/include/neuron/connection/neu_connection.h index 5518133a1..aed4ca446 100644 --- a/include/neuron/connection/neu_connection.h +++ b/include/neuron/connection/neu_connection.h @@ -254,6 +254,8 @@ ssize_t neu_conn_recv(neu_conn_t *conn, uint8_t *buf, ssize_t len); ssize_t neu_conn_udp_recvfrom(neu_conn_t *conn, uint8_t *buf, ssize_t len, void *src); +void neu_conn_clear_recv_buffer(neu_conn_t *conn); + /** * @brief Specify the client to send data. * diff --git a/plugins/modbus/modbus_req.c b/plugins/modbus/modbus_req.c index dcb7bc2bd..15edf2002 100644 --- a/plugins/modbus/modbus_req.c +++ b/plugins/modbus/modbus_req.c @@ -104,6 +104,8 @@ int modbus_send_msg(void *ctx, uint16_t n_byte, uint8_t *bytes) neu_plugin_t *plugin = (neu_plugin_t *) ctx; int ret = 0; + neu_conn_clear_recv_buffer(plugin->conn); + plog_send_protocol(plugin, bytes, n_byte); if (plugin->is_server) { diff --git a/src/connection/connection.c b/src/connection/connection.c index 3ce15959b..dde7bc85c 100644 --- a/src/connection/connection.c +++ b/src/connection/connection.c @@ -407,6 +407,40 @@ ssize_t neu_conn_send(neu_conn_t *conn, uint8_t *buf, ssize_t len) return ret; } +void neu_conn_clear_recv_buffer(neu_conn_t *conn) +{ + if (!conn->is_connected) { + return; + } + + uint8_t temp_buf[256]; + ssize_t ret; + + switch (conn->param.type) { + case NEU_CONN_TCP_CLIENT: + do { + ret = recv(conn->fd, temp_buf, sizeof(temp_buf), MSG_DONTWAIT); + + if (ret > 0) { + continue; + } else if (ret == 0) { + zlog_info(conn->param.log, + "Connection closed while clearing buffer."); + break; + } else if (errno == EAGAIN || errno == EWOULDBLOCK) { + break; + } else { + zlog_error(conn->param.log, "Error clearing buffer: %s", + strerror(errno)); + break; + } + } while (ret > 0); + break; + default: + break; + } +} + ssize_t neu_conn_recv(neu_conn_t *conn, uint8_t *buf, ssize_t len) { ssize_t ret = 0;