@@ -111,9 +111,9 @@ void center::wait_cli_login()
111
111
};
112
112
113
113
// 用于接收数据的缓冲区
114
- std::array<char , protocal ::kCLI_LOGIN_PACSIZE_ > packet {0 };
115
- std::array<char , protocal ::kCLI_LOGIN_UID_ > uidbuf {0 };
116
- std::array<unsigned char , protocal ::kCLI_LOGIN_STATE_ > statebuf {0 };
114
+ std::array<char , protocol ::kCLI_LOGIN_PACSIZE_ > packet {0 };
115
+ std::array<char , protocol ::kCLI_LOGIN_UID_ > uidbuf {0 };
116
+ std::array<unsigned char , protocol ::kCLI_LOGIN_STATE_ > statebuf {0 };
117
117
// 创建socket
118
118
int sock_fd = socket (AF_INET, SOCK_DGRAM, 0 );
119
119
// 服务端addr和客户端addr, 后者保存发送方的信息
@@ -142,20 +142,26 @@ void center::wait_cli_login()
142
142
// 线程主循环
143
143
while (true )
144
144
{
145
- int recv_num = recvfrom (sock_fd, packet.data (), packet.size (), MSG_WAITALL, (sockaddr*)&addr_cli, &place_holder_1);
145
+ char recv_buf[8 ];
146
+ memset (recv_buf, 0 , sizeof (recv_buf));
147
+ int recv_num = recvfrom (sock_fd,recv_buf, protocol::kCLI_LOGIN_PACSIZE_ , MSG_WAITALL, (sockaddr*)&addr_cli, &place_holder_1);
146
148
// MSG_WAITALL:要求阻塞操作,直到请求得到完整的满足。
147
149
// 如果捕捉到信号,错误或者连接断开发生,或者下次被接收的数据类型不同,仍会返回少于请求量的数据。
148
150
149
151
// 可能是阻塞超时, 进行下次循环
150
- if (recv_num < 0 )
152
+ if (recv_num < 0 ){
153
+ LOG_WARN << " recv from client error" ;
151
154
continue ;
155
+ }
152
156
157
+ for (int i = 0 ; i < 8 ; i++)
158
+ packet[i] = recv_buf[i];
153
159
// 按照协议格式进行解析, 并且得到ip等其他信息
154
- memcpy (uidbuf.data (), packet.data (), protocal ::kCLI_LOGIN_UID_ );
160
+ memcpy (uidbuf.data (), packet.data (), protocol ::kCLI_LOGIN_UID_ );
155
161
for (auto & ch :uidbuf)
156
162
ch += ' 0' ;
157
163
size_t uid = std::atol (uidbuf.data ());
158
- memcpy (statebuf.data (), packet.data () + protocal ::kCLI_LOGIN_UID_ , protocal ::kCLI_LOGIN_STATE_ );
164
+ memcpy (statebuf.data (), packet.data () + protocol ::kCLI_LOGIN_UID_ , protocol ::kCLI_LOGIN_STATE_ );
159
165
size_t state = statebuf[0 ];
160
166
// state暂时不做处理
161
167
@@ -205,7 +211,8 @@ void center::wait_cli_login()
205
211
else if (this ->mirs_data_ .size () == 1 )
206
212
available_mir = (*mirs_data_.begin ()).first ;
207
213
// 回复可用mir地址
208
- int send_num = sendto (sock_fd, &available_mir, sizeof (available_mir), 0 , (sockaddr*)&addr_cli, sizeof (addr_cli));
214
+ char send_buf[4 ] = {available_mir.seg0 ,available_mir.seg1 ,available_mir.seg2 ,available_mir.seg3 };
215
+ int send_num = sendto (sock_fd, send_buf, protocol::kCENT_RESPONSE_PACSIZE_ , 0 , (sockaddr*)&addr_cli, sizeof (addr_cli));
209
216
login_count++;
210
217
211
218
// 数据库记录日志
@@ -228,7 +235,7 @@ void center::wait_cli_login()
228
235
atom_mutex_ = false ;
229
236
230
237
// 设置一段时间后pop掉队头的任务
231
- this ->pool_ .run ( [this ](){
238
+ this ->pool_ .run ( [this , &uid ](){
232
239
sleep (telemeter::setting->cli_login_cache_time_ );
233
240
while (true )
234
241
{
@@ -240,8 +247,11 @@ void center::wait_cli_login()
240
247
atom_mutex_ = false ;
241
248
LOG_INFO << " erase login cache of client: " << id;
242
249
}
243
- else
250
+ else {
251
+ LOG_INFO << " cached client login, no reply for client: " << uid;
244
252
continue ;
253
+ }
254
+
245
255
}
246
256
});
247
257
break ;
@@ -271,9 +281,9 @@ void center::listen_mir_beat()
271
281
size_t all_beat_count {0 }; // 用于判活算法
272
282
273
283
// 用于接收数据的缓冲区
274
- std::array<uint8_t , protocal ::kMIR_BEAT_PACSIZE_ > packet {0 };
275
- std::array<uint8_t , protocal ::kMIR_BEAT_IP_ > ipbuf {0 };
276
- std::array<uint8_t , protocal ::kMIR_BEAT_LOAD_ > loadbuf {0 };
284
+ std::array<uint8_t , protocol ::kMIR_BEAT_PACSIZE_ > packet {0 };
285
+ std::array<uint8_t , protocol ::kMIR_BEAT_IP_ > ipbuf {0 };
286
+ std::array<uint8_t , protocol ::kMIR_BEAT_LOAD_ > loadbuf {0 };
277
287
// 创建socket
278
288
int sock_fd = socket (AF_INET, SOCK_DGRAM, 0 );
279
289
// 服务端addr和客户端addr, 后者保存发送方的信息
@@ -298,19 +308,28 @@ void center::listen_mir_beat()
298
308
// 线程主循环
299
309
while (true )
300
310
{
301
- int recv_num = recvfrom (sock_fd, packet.data (), packet.size (), MSG_WAITALL, (sockaddr*)&addr_mir, &place_holder_1);
311
+ char recv_buf[8 ] = {0 };
312
+ memset (recv_buf, 0 , sizeof (recv_buf));
313
+ int recv_num = recvfrom (sock_fd, recv_buf, protocol::kMIR_BEAT_PACSIZE_ , MSG_WAITALL, (sockaddr*)&addr_mir, &place_holder_1);
302
314
// MSG_WAITALL:要求阻塞操作,直到请求得到完整的满足。
303
315
// 如果捕捉到信号,错误或者连接断开发生,或者下次被接收的数据类型不同,仍会返回少于请求量的数据。
304
316
305
317
// 可能是阻塞超时, 进行下次循环
306
- if (recv_num < 0 )
318
+ if (recv_num < 0 ) {
319
+ LOG_WARN << " recv from mirror error" ;
307
320
continue ;
321
+ }
308
322
323
+ for (int i = 0 ; i < 8 ; i++)
324
+ packet[i] = recv_buf[i];
309
325
// 按照协议格式进行解析, 并且得到ip等其他信息
310
- memcpy (ipbuf.data (), packet.data (), protocal::kMIR_BEAT_IP_ );
311
- memcpy (loadbuf.data (), packet.data () + protocal::kMIR_BEAT_IP_ , protocal::kMIR_BEAT_LOAD_ );
326
+ memcpy (ipbuf.data (), packet.data (), protocol::kMIR_BEAT_IP_ );
327
+
328
+ memcpy (loadbuf.data (), packet.data () + protocol::kMIR_BEAT_IP_ , protocol::kMIR_BEAT_LOAD_ );
329
+
330
+ mir_ip = IP (ipbuf[0 ], ipbuf[1 ], ipbuf[2 ], ipbuf[3 ]);
331
+ LOG_INFO << mir_ip.to_string () << " send packet " << packet.data ();
312
332
313
- mir_ip = (ipbuf[0 ] << 24 ) + (ipbuf[1 ] << 16 ) + (ipbuf[2 ] << 8 ) + (ipbuf[3 ]);
314
333
if (mirs_data_.count (mir_ip) == 0 )
315
334
{
316
335
mirs_data_.insert ({mir_ip, MirDescript ()});
@@ -324,17 +343,17 @@ void center::listen_mir_beat()
324
343
all_beat_count++;
325
344
if (all_beat_count >= mirs_data_.size () - 1 )
326
345
{
327
- for (auto & kvp : mirs_data_)
328
- {
329
- if (kvp.second .decre_and_get_beat () <= 0 );
330
- {
331
- // 说明有mir掉线了
332
- int i = 3 ; // 占位避免编译器报warning
333
- // dblog(MIR_DISCONECT);
334
- mirs_data_.erase (kvp.first );
335
- LOG_INFO << " mirror disconnect: " << const_cast <IP*>(&kvp.first )->to_string ();
336
- }
337
- }
346
+ // for(auto& kvp : mirs_data_)
347
+ // {
348
+ // if(kvp.second.decre_and_get_beat() <= 0);
349
+ // {
350
+ // //说明有mir掉线了
351
+ // int i = 3; //占位避免编译器报warning
352
+ // //dblog(MIR_DISCONECT);
353
+ // mirs_data_.erase(kvp.first);
354
+ // LOG_INFO << "mirror disconnect: " << const_cast<IP*>(&kvp.first)->to_string();
355
+ // }
356
+ // }
338
357
}
339
358
}
340
359
0 commit comments