关于libmodbus下TCP重复连接的问题

首先创建一个连接

modbus_t *ctx = modbus_new_tcp("172.17.64.54", 9999);

while (modbus_connect(ctx) == -1l) {
   std::cout << "Error: " << modbus_strerror(errno) << std::endl;
}

之后释放此连接

modbus_close(ctx);
modbus_free(ctx);

 此时ctx指针没有被置空,如果不重置该指针会导致向原来的已经希望释放的指针指向的内存进行读取相关数据,会造成TCP连接的疯狂重连,

WireShark截图如下:

原因:使用C中的free函数释放内存后操作系统并不会立即对此堆内存块进行回收,而是暂时保留 

因此为防止指针重复指向相同地址,在释放连接后需要将原指针手动置空,之后再利用此指针保存新的连接对象

像如下这样:

    ctx= nullptr;


    ctx = modbus_new_tcp("172.17.64.54", 9999);

    while (modbus_connect(ctx) == -1l) {
        std::cout << "Error: " << modbus_strerror(errno) << std::endl;
    }

 

posted @ 2024-11-07 11:01  BlackSnow  阅读(472)  评论(0)    收藏  举报