| 201 | } |
| 202 | |
| 203 | int send_data(const string& data_str, TCPMsg::TcpMsgType msg_type) |
| 204 | { |
| 205 | TCPMsg::TcpMsgBuilder msg_builder(data_str, msg_type); |
| 206 | while (true) |
| 207 | { |
| 208 | const auto _send_size = send(m_socket_id, (const char*)msg_builder.m_p_msg.get(), msg_builder.m_msg_len, 0); |
| 209 | if (_send_size != msg_builder.m_msg_len) |
| 210 | { |
| 211 | #if defined(_WIN32) || defined(_WIN64) |
| 212 | const auto error_num = WSAGetLastError(); |
| 213 | PTraceError("Error: send data error: " << error_num << ", send return: " << _send_size |
| 214 | << ", need send_size=" << msg_builder.m_msg_len); |
| 215 | /*if (error_num == 10060) { |
| 216 | continue; |
| 217 | }*/ |
| 218 | #elif defined(__linux__) || defined(__unix__) || defined(__FreeBSD__) || defined(__APPLE__) |
| 219 | PTraceError("Error: send data error: " << errno << ", send return: " << _send_size |
| 220 | << ", need send_size=" << m_task_id.size()); |
| 221 | if (errno == 9) { /* connection closed */ |
| 222 | break; |
| 223 | } |
| 224 | #endif |
| 225 | this_thread::sleep_for(std::chrono::seconds(1)); |
| 226 | continue; |
| 227 | } |
| 228 | |
| 229 | break; |
| 230 | } |
| 231 | |
| 232 | return msg_builder.m_msg_len; |
| 233 | } |
| 234 | |
| 235 | void run_heart_thread(){ |
| 236 | m_thread_heart = thread(std::bind(&TCPClient::heart, this)); |
no test coverage detected