-2

UDP サーバーに接続してそこからデータを受信できる iOS 用のアプリケーションを作成しようとしています。私の状況:

  1. Windows マシン (IP = 192.168.1.6) に UDP サーバーがあります。
  2. 私は iPad (IP = 192.168.1.5) を持っています。
  3. UDP サーバーは、仮想アドレス (IP = 239.254.1.2) およびポート (7125) に、「HELLO!!!!! I'm here!!!!」のようなメッセージを送信します。

仮想 IP アドレス (IP = 239.254.1.2) とポート (7125) に接続して、「HELLO!!!!! I'm here!!!!」というメッセージを受信できる iOS アプリ用のロジックを追加する必要があります。UDP サーバーから。

誰か提案はありますか?

更新1:

UDP接続にはGCDAsyncUdpSocketを使用しています

ここに私のコード:

@interface ViewController () {
    GCDAsyncUdpSocket *udpSocket;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
}

- (IBAction)startStop:(id)sender {
    if (isRunning) {
        // STOP udp echo server
        [udpSocket close];

        [self logInfo:@"Stopped Udp Echo server"];
        isRunning = false;

        [portField setEnabled:YES];
        [startStopButton setTitle:@"Start" forState:UIControlStateNormal];
    } else {
        // START udp echo server

        int port = [portField.text intValue];
        if (port < 0 || port > 65535) {
            portField.text = @"";
            port = 0;
        }

        NSError *error = nil;

        if (![udpSocket bindToPort:7125 error:&error]) {
            [self logError:FORMAT(@"Error starting server (bind): %@", error)];
            return;
        }

        if (![udpSocket joinMulticastGroup:@"239.254.1.2" error:&error]) {
            [self logError:FORMAT(@"Error join Multicast Group: %@", error)];
            return;
        }

        if (![udpSocket beginReceiving:&error])
        {
            [udpSocket close];

            [self logError:FORMAT(@"Error starting server (recv): %@", error)];
            return;
        }

        [self logInfo:FORMAT(@"Udp Echo server started on port %hu", [udpSocket localPort])];
        isRunning = YES;

        [portField setEnabled:NO];
        [startStopButton setTitle:@"Stop" forState:UIControlStateNormal];
    }
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
                                               fromAddress:(NSData *)address
                                         withFilterContext:(id)filterContext
{
    if (!isRunning) return;

    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    if (msg)
    {
        /* If you want to get a display friendly version of the IPv4 or IPv6 address, you could do this:

        NSString *host = nil;
        uint16_t port = 0;
        [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];

        */

        [self logMessage:msg];
    }
    else
    {
        [self logError:@"Error converting received data into UTF-8 String"];
    }

    [udpSocket sendData:data toAddress:address withTimeout:-1 tag:0];
}

ログの「開始」ボタンを押すと、「Udp Echo サーバーがポート 7125 で開始されました」というメッセージが表示されますが、メソッドをデリゲートします

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

起動されず、アプリケーションは仮想 IP アドレスからメッセージを受信しません。この問題で私を助けてもらえますか?

ありがとうございました。

4

2 に答える 2

1

239.254.1.2 は、UDP サーバーがパケットを送信するマルチキャスト アドレスです。そのアドレスを聞いている人は誰でもパケットを受け取ります。そう:

  • UDP ソケットを作成する
  • ソケットをポート 7125 にバインドします
  • マルチキャスト グループ 239.254.1.2 に参加します
  • アプリは udp パケットの受信を開始します

おそらく、UDP はコネクションレス プロトコルであること、つまり UDP サーバーに接続できないことだけを述べておく必要があります。

于 2013-03-14T23:39:22.753 に答える
0

RichardBrock は正しく、UPDATE1 のサンプル コードは完全に機能します。問題は自宅のネットワークにあり、このコードを職場のネットワークで試したところ、すべて正常に動作しました!!!

ありがとうございます

于 2013-03-15T14:40:55.020 に答える