iOS實現UPD廣播(AsyncSocket)

之前試了OC自帶的socket庫進行實現,但是在向服務器發送消息包時候block了,還是用AsyncSocket好了。

1.創建socket,修改配置(允許廣播形式)

2.綁定本地IP

3.向服務器發送包

4.接收包


1.創建socket:一個客戶端只進行一條socket的連接,所以這裏使用了單例

+(Singleton *)sharedInstance{
    static Singleton *sharedInstace = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstace = [[self alloc]init];
    });
    return sharedInstace;
}

 //創建socket(UDP)
    self.socket = [[AsyncUdpSocket alloc]initWithDelegate:self];
    
    //允許廣播形式
    [self.socket enableBroadcast:YES error:nil];

2.綁定本地IP

 self.localhost = [self getIPAddress];
    NSError *error = nil;
    
    //綁定本地IP與端口
    [self.socket bindToAddress:self.localhost port:0 error:&error];

本地IP的獲取方法:

-(NSString *)getIPAddress{
    NSString *address = @"error";
    struct ifaddrs *interface = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    
    success = getifaddrs(&interface);
    if(success == 0){
        temp_addr = interface;
        while (temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET){
                
                
                //if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]){
                address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                // }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    freeifaddrs(interface);
    return address;
}

這個原理我還沒明白透,爲什麼其中的IPV4地址就是本地IP


3.向服務器發送包

-(void)longConnectToSocket{
    NSData *dataStream = [message dataUsingEncoding:NSUTF8StringEncoding];
    [self.socket sendData:dataStream
                   toHost:@"255.255.255.255"
                     port:YourPort
              withTimeout:-1
                      tag:0];
}

廣播的IP都是255.255.255.255,端口是固定的


4.接收包

這裏在發送成功後進行了回調然後再接收包

-(void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag{
    [self.socket receiveWithTimeout:-1 tag:tag];
}

-(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
    do some thing about data
    return YES;
}

這兩個方法都是delegate的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章