美文网首页IOSbug
开启UDP队列监听,loop循环后的Bug领悟!

开启UDP队列监听,loop循环后的Bug领悟!

作者: 司马捷 | 来源:发表于2015-07-21 18:41 被阅读339次

程序启动,自以为的,在loop中循环,在loop中加入socket监听端口,还需要loop一直循环么?
答案自然不知道,但事实问题,在这种队列中监听.
导致其他线程出问题了.
1.创建随机队列方法不了解.
2.监听端口的机制学习.

下面是一个错误的示范,时刻留意这个bug.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    CFSocketContext ctx = { 0, self, NULL, NULL, NULL };
    recvSocket_ = CFSocketCreate(kCFAllocatorDefault,
                                 PF_INET,
                                 SOCK_DGRAM,
                                 IPPROTO_UDP,
                                 kCFSocketDataCallBack,
                                 (CFSocketCallBack)DiscoverReceiveCallback,
                                 &ctx);
    
    if (recvSocket_ == NULL) {
        LOG(@"[DSCV] Cannot create listening socket. %d", errno);
        return ;
    }
    
    int flag = 1;
    setsockopt(CFSocketGetNative(recvSocket_), SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
    
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_len = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = INADDR_ANY;
    
    NSData *addrData = [NSData dataWithBytes:&addr length:sizeof(addr)];
    if (CFSocketSetAddress(recvSocket_, (CFDataRef)addrData)) {
        CFSocketInvalidate(recvSocket_);
        CFRelease(recvSocket_);
        recvSocket_ = NULL;
        LOG(@"[DSCV] Cannot set address to socket.");
        return ;
    }
    LOG(@"recvSocket_------>%@",recvSocket_);
    CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, recvSocket_, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);
    CFRelease(source);
    
   CFRunLoopRun();  });

相关文章

  • 开启UDP队列监听,loop循环后的Bug领悟!

    程序启动,自以为的,在loop中循环,在loop中加入socket监听端口,还需要loop一直循环么?答案自然不知...

  • 成长(10/2000)——面试题合集7

    事件循环机制event-loop 事件循环机制由三部分组成:调用栈、消息队列和微任务队列。 event-loop开...

  • vue-Event Loop事件循环队列 ,$nextTick

    vue--Event Loop事件循环队列 ,$nextTick ,队列 , 异步的关系 数据更改==>不会立即...

  • 20211021

    1、js里的事件循环机制(event loop)答:js事件循环中有异步队列有两种:宏任务队列(macro)和微任...

  • 知识点

    ...语法 反转 Event Loop(事件循环) 主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个...

  • SpringBoot整合中间件RabbitMQ(五)

    1.开启注解 开启基于RabbitMQ的注解 2.监听程序 编写监听服务 3.发送队列消息 运行测试:

  • linux shell命令行向udp端口发送数据

    1 nc 先nc -uv,然后在输入数据即可nc -uvz可以用来测试udp端口是否开启监听 2 /dev/udp...

  • Run Loop About

    运行循环和重绘视图 iOS应用启动时会开始一个运行循环(run loop)。运行循环的工作方式是监听事件,例如触摸...

  • Event Loop

    JS 主线程不断的循环往复的从任务队列中读取任务,执行任务,这种运行机制称为事件循环(event loop)推荐看...

  • Python基础语法了解一下(三)

    条件循环语句 Conditional Loop Statement 迭代循环语句 Iterative Loop ...

网友评论

  • fc3f08fe1665:你能描述下哪里有问题么,该如何解决么?
    司马捷:@向日葵De视界 嗯,可以,那个封装的,使用起来很方便.僵尸对象啊,把你分配的内存都检查一遍,应该好找
    fc3f08fe1665:@机器人小雪 dcd? GCD吧,我这个就是在断开连接的时候,出现僵尸对象。现在在研究asyncsocket,应该可以代替这种写法。
    司马捷:@向日葵De视界 具体我也忘了啊,这种问题你也会遇到? 这种socket连接,我觉得就是多线程的,放在dcd全局并发队列中,就有问题

本文标题:开启UDP队列监听,loop循环后的Bug领悟!

本文链接:https://www.haomeiwen.com/subject/oqbpqttx.html