10

最初のアプローチでは、 sampleProjectに基づいてクライアントサーバーアプリを作成し、サーバーにデータを送信します。

Legend:
sender
    address = reciver ip
    port = reciver port
reciver
    address = null since he is listening
    port = in my case 55555

作業コード

エラーチェックのスキップは、公共の理由でのみ意図的です

送信者

-(id*)initForSender:(NSString*)address port:(int)port
 {
   self = [super init];
   if (self) {
        _port = port;
        _address = address;
        tag = 0;
        _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

        [_udpSocket bindToPort:0 error:&error];
        [_udpSocket beginReceiving:&error];

      return self;
    }
}

-(void)send:(NSData*)data{
     [_udpSocket sendData:data toHost:_address port:_port withTimeout:-1 tag:tag];
     tag++;
}

レシーバー/リスナー

-(id*)initForReceiver:(NSString*)address port:(int)port
{
   self = [super init];
   if (self) {
        _port = port;
        _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
        NSError *error = nil;

       [_udpSocket bindToPort:0 error:&error];
       [_udpSocket beginReceiving:&error];
    }
    return self;
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
      fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
    //Do something with receive data
}

マルチキャスト

しかし、多くの受信者に送信するクライアントが必要です。フォーム sendre またはリスナーは [GCDAsyncUdpSocket joinMulticastGroup:error]; を使用する必要があります。私はstackoverflow、uncle google、およびCococaAsyncSocket(UDPに関する単語はありません)を実行し、収集した情報を照合して、このコードを思いつきました。それは機能していないと確信していますが、その理由はわかりません。

Legend:
sender
    address = sender ip
    port = sender port in my case 55555
reciver
    address = sender ip
    port = sender port in my case 55555

動作しないコード

-(id*)initForSender:(NSString*)address port:(int)port
{
    self = [super init];
    if (self) {
        _port = port;
        _address = address;
        _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
        NSError *error = nil;

        [_udpSocket bindToPort:_port error:&error];
        [_udpSocket joinMulticastGroup:_address error:&error];
        [_udpSocket enableBroadcast:YES error:&error];

    }
    return self;
}

-(void)send:(NSData*)data{
     [_udpSocket sendData:data toHost:_address port:_port withTimeout:-1 tag:tag];
     tag++;
}

レシーバー/リスナー

-(id*)initForReceiver:(NSString*)address port:(int)port
{
    self = [super init];
    if (self) {
        _port = port;
        _address = address;
        _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
         NSError *error = nil;

        [_udpSocket bindToPort:_port error:&error];
        [_udpSocket joinMulticastGroup:_address error:&error];
        [_udpSocket beginReceiving:&error])

    }
    return self;
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
      fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
   //Do something with receive data
}

アップデート:

address@"224.0.1.1" などの未使用の IP を使用すると、うまくいくことがわかりましたが、少し奇妙に感じます。私はそれを正しくやっていますか?

4

1 に答える 1

11
  1. マルチキャスト アドレスは、マルチキャスト目的で特別に予約されたアドレスです。ホストがマルチキャスト アドレス (グループ) にデータを送信すると、そのグループに参加しているすべてのホストがデータを受信します。

  2. マルチキャスト グループからデータを受信したいホストは、そのグループに参加する必要があります。GCDAsyncUdpSocket の 3 つの手順は次のとおりです。 (グループ アドレスとグループ ポートの組み合わせは、選択したマルチキャスト グループに対して一意である必要があることに注意してください)

    [_udpSocket bindToPort:_port error:&error];
    [_udpSocket joinMulticastGroup:_address error:&error];
    [_udpSocket beginReceiving:&error])
    
  3. 送信者の場合、この 2 行は必要ありません。

    [_udpSocket bindToPort:0 error:&error];  //bindToPort:0 is same as auto-select sender port by default.
    [_udpSocket beginReceiving:&error];   //if you don't want to received, no need for this.
    

プライベート ローカル ネットワークには 239.0.0.0-239.255.255.255 を使用します。224 を避けてください... 上のリンクから詳細を読むことができます。

于 2013-08-10T18:42:40.397 に答える