Skip to content

Commit f91571f

Browse files
authored
Merge pull request #2344 from hxy7yx/main-1
fix(modbus):clear recv buf before sending
2 parents 15a10f5 + d33fff5 commit f91571f

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

include/neuron/connection/neu_connection.h

+2
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ ssize_t neu_conn_recv(neu_conn_t *conn, uint8_t *buf, ssize_t len);
254254
ssize_t neu_conn_udp_recvfrom(neu_conn_t *conn, uint8_t *buf, ssize_t len,
255255
void *src);
256256

257+
void neu_conn_clear_recv_buffer(neu_conn_t *conn);
258+
257259
/**
258260
* @brief Specify the client to send data.
259261
*

plugins/modbus/modbus_req.c

+2
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ int modbus_send_msg(void *ctx, uint16_t n_byte, uint8_t *bytes)
113113
neu_plugin_t *plugin = (neu_plugin_t *) ctx;
114114
int ret = 0;
115115

116+
neu_conn_clear_recv_buffer(plugin->conn);
117+
116118
plog_send_protocol(plugin, bytes, n_byte);
117119

118120
if (plugin->is_server) {

src/connection/connection.c

+34
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,40 @@ ssize_t neu_conn_send(neu_conn_t *conn, uint8_t *buf, ssize_t len)
407407
return ret;
408408
}
409409

410+
void neu_conn_clear_recv_buffer(neu_conn_t *conn)
411+
{
412+
if (!conn->is_connected) {
413+
return;
414+
}
415+
416+
uint8_t temp_buf[256];
417+
ssize_t ret;
418+
419+
switch (conn->param.type) {
420+
case NEU_CONN_TCP_CLIENT:
421+
do {
422+
ret = recv(conn->fd, temp_buf, sizeof(temp_buf), MSG_DONTWAIT);
423+
424+
if (ret > 0) {
425+
continue;
426+
} else if (ret == 0) {
427+
zlog_info(conn->param.log,
428+
"Connection closed while clearing buffer.");
429+
break;
430+
} else if (errno == EAGAIN || errno == EWOULDBLOCK) {
431+
break;
432+
} else {
433+
zlog_error(conn->param.log, "Error clearing buffer: %s",
434+
strerror(errno));
435+
break;
436+
}
437+
} while (ret > 0);
438+
break;
439+
default:
440+
break;
441+
}
442+
}
443+
410444
ssize_t neu_conn_recv(neu_conn_t *conn, uint8_t *buf, ssize_t len)
411445
{
412446
ssize_t ret = 0;

0 commit comments

Comments
 (0)