端口池分配端口改成无序分配

解决zlmediakit重启后端口重复分配导致国标串流问题
This commit is contained in:
xia-chu 2023-08-20 12:07:04 +08:00
parent 0c80f0c13c
commit 895e93cb6a

View File

@ -8,12 +8,13 @@
* may be found in the AUTHORS file in the root of the source tree. * may be found in the AUTHORS file in the root of the source tree.
*/ */
#include <cstdlib>
#include <cinttypes>
#include <random>
#include "Rtsp.h" #include "Rtsp.h"
#include "Common/Parser.h" #include "Common/Parser.h"
#include "Common/config.h" #include "Common/config.h"
#include "Network/Socket.h" #include "Network/Socket.h"
#include <cinttypes>
#include <cstdlib>
using namespace std; using namespace std;
using namespace toolkit; using namespace toolkit;
@ -392,9 +393,13 @@ public:
private: private:
void setRange(uint16_t start_pos, uint16_t end_pos) { void setRange(uint16_t start_pos, uint16_t end_pos) {
std::mt19937 rng(std::random_device {}());
lock_guard<recursive_mutex> lck(_pool_mtx); lock_guard<recursive_mutex> lck(_pool_mtx);
auto it = _port_pair_pool.begin();
while (start_pos < end_pos) { while (start_pos < end_pos) {
_port_pair_pool.emplace_back(start_pos++); // 随机端口排序,防止重启后导致分配的端口重复
_port_pair_pool.insert(it, start_pos++);
it = _port_pair_pool.begin() + (rng() % (1 + _port_pair_pool.size()));
} }
} }