2016-06-01 4 views
0

UDP 포트를 만들고 브로드 캐스트 포트로 데이터를 보내려고합니다. 동일한 WiFi 네트워크에있는 다른 장치에서도 동일한 데이터를 수신 할 수 있습니다. 수신 된 응답 here에 주어진대로 브로드 캐스트 포트의 IP 주소를 계산 중입니다.GCDAsyncUDPSocket : 성공적으로 전송되었지만 데이터를받지 못했습니다.

self.udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue() socketQueue:nil]; 
NSError *error; 
[self.udpSocket enableReusePort:YES error:&error]; 
[self.udpSocket enableBroadcast:YES error:&error]; 

- (IBAction)sendMessageToBroadcastPort:(id)sender { 
[self.udpSocket sendData:[@"Hi" dataUsingEncoding:NSUTF8StringEncoding] toHost:[self getUDPBroadcastAddress] port:5556 withTimeout:-1 tag:1]; 
} 

내가 위임 방법 didSendData로 데이터를 전송에 성공을 얻을 : 호출되는

는 그 후 나는 다음과 같습니다 일부 연결 코드를 작성했습니다.

여기에 무엇이 누락되어 있는지 안내해주십시오.

감사합니다.

UPDATE : 방송 포트로부터 데이터를 수신 Cpde :

- (void)listenForPackets 
{ 
dispatch_queue_t dQueue = dispatch_queue_create("client udp socket", NULL); 
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dQueue socketQueue:nil]; 
NSError *error = nil; 

if (![udpSocket bindToPort:5556 error:&error]) { 
    NSLog(@"Error binding: %@",error);//not connecting to host 
    return; 
} 
if (![udpSocket beginReceiving:&error]) { 
    NSLog(@"Error receiving: %@",error); 
    return; 
} 
NSLog(@"Socket Ready"); 
} 

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data 
    fromAddress:(NSData *)address 
withFilterContext:(id)filterContext 
{ 
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
if (msg) 
{ 
    NSLog(@"RCV: %@", msg); 
} 
else 
{ 
    NSString *host = nil; 
    uint16_t port = 0; 
    [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address]; 
    NSLog(@"Unknown message from : %@:%hu", host, port); 
} 
} 

I를 계산 한 후 얻을 방송 IP는 192.168.2.255

UPDATE 2 : :

내가 직면하고있는 시나리오는 정말 다르며 이상합니다. 수신은 때로는 작동하며 때로는 수신하지 않습니다. 두 개의 앱을 설치했을 때 데이터가 수신되지 않았습니다. 전송 만 성공했습니다. 나는 앱이 데이터 수신을 시작한 지 얼마되지 않아 계속 유지했다. 경우에 따라 잠시 후 수신을 중단하거나 문제없이 수신을 계속합니다. 문제는 무엇이 될 수 있습니까?

+0

UDP는 연결이 적기 때문에'connectToHost'를 호출 할 필요가 없습니다. 'sendData : toHost : port : withTimeout'을 사용해야합니다. – Paulw11

답변

0

내가 직면 한 시나리오가 정말 다른 괴상한 것처럼 나는이 질문에 대답하고있다. 수신은 때로는 작동하며 때로는 수신하지 않습니다. 두 개의 앱을 설치했을 때 데이터가 수신되지 않았습니다. 전송 만 성공했습니다. 나는 앱이 데이터 수신을 시작한 지 얼마되지 않아 계속 유지했다. 어떤 경우에는 얼마 후에 수신이 중단되었습니다.

실제로 이더넷에 연결된 내 Mac의 공유 인터넷 연결을 사용하고있었습니다. 내 Wi-Fi 네트워크를 적절한 광대역 네트워크로 변경 했으므로 아무런 문제없이 작동합니다.

희망이 비슷한 시나리오를 가진 사람에게 도움이 되길 바랍니다. :)

1

는 다음과 같이하십시오 :

는 소켓을 만들기 : 소켓에 대한

-(void)createClientUdpSocket 
{ 
    dispatch_queue_t dQueue = dispatch_queue_create("client udp socket", NULL); 

    sendUdpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue: dQueue socketQueue: nil]; 
    [sendUdpSocket receiveOnce:nil]; 
    [sendUdpSocket joinMulticastGroup:[self getIPAddress] error:nil]; // Put your IP Address 
    NSLog(@"Ready"); 
} 

위임 방법을.

-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext 
{ 
    NSString *ip = [GCDAsyncUdpSocket hostFromAddress:address]; 
    uint16_t port = [GCDAsyncUdpSocket portFromAddress:address]; 
    NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    // Continue to wait for a message to receive the next 
    NSLog (@ "The server receives the response [%@:% d]%@", ip, port, s); 
    [sock receiveOnce:nil]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    [self sendBackToHost:ip port:port withMessage:s]; 
    }); 
} 

-(void)sendBackToHost:(NSString *)ip port:(uint16_t)port withMessage:(NSString *)s{ 

     [sendUdpSocket sendData:yourData toHost:yourIP port:5556 withTimeout:60 tag:200]; 
     NSLog(@"sent message to server"); 
} 

희망이 도움이 될 것입니다. 그 나를 위해 일하는 :)

+0

답장을 보내 주셔서 감사합니다. 이제는 소켓을 연결하지 않으므로 오류가 발생하지 않지만 샘플 IP 수신 응용 프로그램은 브로드 캐스팅 IP의 내용을 읽으려고 할 때 아무것도 수신하지 않습니다. 수신기의 코드로 내 질문을 업데이트했습니다. 아니면 계산 된 IP에 문제가 있습니까? 안내해주십시오. – Yogi

+0

나는 지금까지 할 수 있었던 것에 기초하여 나의 질문을 업데이트했다. 한번 봐주세요. – Yogi

+0

지금 작품을 받았지만 문제가 있습니다.업데이트 된 질문을 확인하십시오. – Yogi

관련 문제