iOS实现UPD广播(AsyncSocket)

来源:互联网 发布:板式换热器计算软件 编辑:程序博客网 时间:2024/05/22 06:50

之前试了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的方法

0 0