123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- //
- // webRtcPingManager.m
- // Private-X
- //
- // Created by xd h on 2024/12/24.
- //
- #import "webRtcPingManager.h"
- #import "WHPingTester.h"
- @interface webRtcPingManager ()<WHPingDelegate>
- {
- WHPingTester *whPingTester;
- NSInteger pingRoomIndex;//开始ping的第x个机房IP
-
- CGFloat allTimeInPingOneIP;//一个IP ping多少次的总延时
- NSInteger pingOneIPNumber;//一个IPping多少次
- NSInteger pingOneIPErrorNumber;//一个IP 错了多少次
- }
- @end
- @implementation webRtcPingManager
- + (instancetype)shareManager {
- static webRtcPingManager *_instance;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- _instance = [[self alloc] init];
- });
- return _instance;
- }
- - (instancetype)init {
- if (self = [super init]) {
- pingRoomIndex = 0;
- //[self registeNotification];
- }
- return self;
- }
- - (void)startPingNextFun
- {
- pingRoomIndex++;
- [self startPingFun];
- }
- #pragma mark ---ping-----站点 判断是否是局域网
- - (void)startPingFun
- {
- allTimeInPingOneIP = 0;
- pingOneIPNumber = 0;
- pingOneIPErrorNumber = 0;
-
- NSString* roomInternetIp = @"";
- NSArray<webrtcServerModel>* webrtcServerList = ksharedAppDelegate.DeviceWebRtcMsgMod.data.webrtcServerList;
-
- if (!webrtcServerList)
- {
- return;
- }
- else if(webrtcServerList.count > pingRoomIndex) {
- webrtcServerModel *model = webrtcServerList[pingRoomIndex];
- roomInternetIp = model.turnIp;
- }
- else{//完成遍历了
-
- NSString *logstr = [[NSString alloc] initWithFormat:@"ping 结束 当前最佳机房IP:%@--延时:%.02fms",ksharedAppDelegate.bestWebrtcServerModel.turnIp,ksharedAppDelegate.bestWebrtcServerModel.delayedms];
-
- HLog(@"%@",logstr)
- [cachesFileManager writeLogsWithMsg:logstr];
-
- NSDictionary *bestdict = [ksharedAppDelegate.bestWebrtcServerModel toDictionary];
- if(bestdict){
- [HWDataManager setObjectWithKey:@"Const_best_webRtc_IPRoom" value:bestdict];
- }
- [[webRtcManager shareManager] relinkWebRtcFun];
-
- [[NSNotificationCenter defaultCenter] postNotificationName:didPingBestWebRtcIPRoomNotification object:nil];
- return;
- }
-
- //IP 出错
- if(!roomInternetIp || roomInternetIp.length ==0){
- if(webrtcServerList && webrtcServerList.count > pingRoomIndex ){
- [self startPingNextFun];
- }
- return;
- }
-
- if (self->whPingTester)
- {
- [self->whPingTester stopPing];
- self->whPingTester = nil;
- }
-
- self->whPingTester = [[WHPingTester alloc] initWithHostName:roomInternetIp];
- self->whPingTester.delegate = self;
- //self->whPingTester.countdownTime = 1; //1秒ping一次
- [self->whPingTester startPing];
-
-
- /// 启动定时器监听 10秒后 whPingTester的状态
- KWeakSelf
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- if(self->whPingTester){
- [weakSelf didGetPingStateIsOK:NO];
- }
- });
-
- }
- #pragma mark ---ping---- 代理回调
- - (void)didPingSucccessWithTime:(float)time withError:(NSError*) error
- {
- HLog(@"time:%f \n error: %@",time,error)
-
- //if(error.code == 111 || time > 1000) //超时或者延时超过100ms,就要记录数据
- if(error != nil)
- {
- pingOneIPErrorNumber += 1;
- }
- else if(time > 0){
- allTimeInPingOneIP += time;
- pingOneIPNumber +=1 ;
- //[self didGetPingStateIsOK:YES];
- //test code
- //[self didGetPingStateIsOK:NO];
- }
-
- if(pingOneIPErrorNumber >= 3){
- [self didGetPingStateIsOK:NO];
- }
- else if (pingOneIPNumber >= 9){
- [self didGetPingStateIsOK:YES];
- }
- }
- - (void)didPingfialewithError:(NSError*)error
- {
- HLog(@" error error: %@",error)
- pingOneIPErrorNumber += 1;
-
- [self didGetPingStateIsOK:NO];
- }
- -(void)didGetPingStateIsOK:(BOOL)isOk
- {
- [self->whPingTester stopPing];
- self->whPingTester = nil;
-
- if (allTimeInPingOneIP > 0) {
- CGFloat averageDelayedms = allTimeInPingOneIP/pingOneIPNumber;
-
- webrtcServerModel*preBestModel = ksharedAppDelegate.bestWebrtcServerModel;
-
- NSArray<webrtcServerModel>* webrtcServerList = ksharedAppDelegate.DeviceWebRtcMsgMod.data.webrtcServerList;
- if (!webrtcServerList || webrtcServerList.count > pingRoomIndex) {
- webrtcServerModel *model = webrtcServerList[pingRoomIndex];
- model.delayedms = averageDelayedms;
-
- NSString *logstr = [[NSString alloc] initWithFormat:@"time: 平均:%f --%@",averageDelayedms,model.turnIp];
- HLog(@"%@",logstr)
-
- [cachesFileManager writeLogsWithMsg:logstr];
-
- if([model.turnIp isEqualToString:preBestModel.turnIp]){
- preBestModel.delayedms = averageDelayedms;
- }
- else{
- if(preBestModel.delayedms > 0 && model.delayedms < preBestModel.delayedms){
- //找到耗时更短的机房
- ksharedAppDelegate.bestWebrtcServerModel = model;
- }
- }
- }
- }
-
- [self startPingNextFun];
- }
- @end
|