2014-01-10 101 views
5

我正在使用GCDAsyncUdpSocket在我的應用程序中編寫UDP套接字。這種情況是這樣的:當用戶點擊按鈕時,它會在局域網中發送一個廣播數據包,然後監聽響應,局域網中有一臺服務器會響應一個UDP數據包。當應用程序收到響應時,它會做一些事情。爲什麼GCDAsyncUdpSocket無法在廣播模式下發送/接收數據包?

我設置GCDAsyncUdpSocket爲如下:

- (void)setupSocket 
{ 
    _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 

    NSError *error = nil; 

    if (![_udpSocket bindToPort:18686 error:&error]) { 
     NSLog(@"Error binding: %@",error); 
     return; 
    } 

    if (![_udpSocket beginReceiving:&error]) { 
     NSLog(@"Error receiving: %@",error); 
     return; 
    } 

    if (![_udpSocket enableBroadcast:YES error:&error]) { 
     NSLog(@"Error enableBroadcast: %@",error); 
     return; 
    } 
} 

然後我在按鈕的動作發送分組如下:

NSString *host = @"255.255.255.255"; 
int port = 8585; 
NSString *msg = @"Hello from iOS"; 
NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding]; 
[_udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:0]; 

- (void)udpSocket:(GCDAsyncUdpSocket *)sock  didReceiveData:(NSData *)data 
               fromAddress:(NSData *)address 
               withFilterContext:(id)filterContext 

方法我偵聽的端口做出頭。它在開始時運行良好,但如果稍後嘗試單擊該按鈕(大約1小時),則無法再發送UDP數據包。

我的局域網服務器將打印收到的數據。我認爲send方法有問題。所以我使用BSD套接字方法發送數據。並使用GCDAsyncUdpSocket來接收回應。但一段時間後發生了同樣的事情。這次我可以發送但不能收到。

我是否錯過了GCDAsyncUdpSocket?爲什麼一段時間後無法發送/接收?任何幫助將非常感激。

+0

我有同樣的問題,你有理由嗎? –

回答

0

這可能是一些超時設置。實施GCDAsyncUdpSocketDelegate協議來獲取有關正在發生的事情的詳細信息。

困難的解決方案是建立一個新的連接。

相關問題