2016-06-01 23 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); 
} 
} 

私は計算後の取得放送IPは192.168.2.255

UPDATE 2:

私が直面しているシナリオは本当に違って変わっています。受信はときどき動作し、時には受信しません。 2つのアプリケーションをインストールしたときに、データが受信されませんでした。送信のみが成功しました。私はアプリをデータの受信を開始した後も続けた。いくつかの例では、しばらくして受信を停止したり、問題なく受信を続けました。何が問題なの?

+0

UDPは接続が少ないので、 'connectToHost'を呼び出す必要はありません。あなたは 'sendData:toHost:port:withTimeout'を使用するべきです – Paulw11

答えて

0

私は直面したシナリオが本当に違って変わっているので、私はこの質問に答えています。受信はときどき動作し、時には受信しません。 2つのアプリケーションをインストールしたときに、データが受信されませんでした。送信のみが成功しました。私はアプリをデータの受信を開始した後も続けた。場合によっては、しばらくして受信を停止しました。

実際に私はイーサネットに接続された私のMacの共有インターネット接続を使用していました。私はWiFiネットワークを適切なブロードバンドネットワークに変更して以来、問題なく動作します。

似たようなシナリオを持つ人に役立ちます。

1

は、以下のように試してみてください。

は、ソケットを作成します:Socketの

-(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に問題はありますか?ご案内ください。 – Yogi

+0

私は今までにできることに基づいて質問を更新しました。見てください。 – Yogi

+0

今は作品を受け取っていますが、問題があります。更新された質問を確認してください。 – Yogi

関連する問題