| 142 | } |
| 143 | |
| 144 | uint16_t Transceiver::init_tcp_socket(uint16_t port, bool bind) |
| 145 | { |
| 146 | LogFunc << VAR(port) << VAR(bind); |
| 147 | |
| 148 | is_tcp_ = true; |
| 149 | |
| 150 | zmq_sock_ = zmq::socket_t(zmq_ctx_, zmq::socket_type::pair); |
| 151 | |
| 152 | zmq_pollitem_send_ = zmq::pollitem_t(zmq_sock_.handle(), 0, ZMQ_POLLOUT, 0); |
| 153 | zmq_pollitem_recv_ = zmq::pollitem_t(zmq_sock_.handle(), 0, ZMQ_POLLIN, 0); |
| 154 | |
| 155 | is_bound_ = bind; |
| 156 | |
| 157 | if (is_bound_) { |
| 158 | // 如果 port 为 0,使用通配符让系统自动分配端口 |
| 159 | std::string bind_addr = std::format("tcp://127.0.0.1:{}", port == 0 ? "*" : std::to_string(port)); |
| 160 | zmq_sock_.bind(bind_addr); |
| 161 | |
| 162 | // 获取实际绑定的端点 |
| 163 | char endpoint[256] = { }; |
| 164 | size_t endpoint_len = sizeof(endpoint); |
| 165 | zmq_getsockopt(zmq_sock_.handle(), ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len); |
| 166 | ipc_addr_ = endpoint; |
| 167 | |
| 168 | tcp_port_ = parse_port_from_endpoint(ipc_addr_); |
| 169 | LogInfo << "TCP socket bound" << VAR(ipc_addr_) << VAR(tcp_port_); |
| 170 | } |
| 171 | else { |
| 172 | ipc_addr_ = std::format("tcp://127.0.0.1:{}", port); |
| 173 | tcp_port_ = port; |
| 174 | zmq_sock_.connect(ipc_addr_); |
| 175 | LogInfo << "TCP socket connected" << VAR(ipc_addr_); |
| 176 | } |
| 177 | |
| 178 | return tcp_port_; |
| 179 | } |
| 180 | |
| 181 | bool Transceiver::should_fallback_to_tcp() |
| 182 | { |
nothing calls this directly
no test coverage detected