After one week fight, I found the problem is caused by the RunLoop. I am using GCDAsyncUDPSocket to replace AsynvUdpSocket, then the problem solved!
GCDAsyncUdpSocket *gcdAsyncUdpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_main_queue()];