3

背景:UDPに基づいてiPhoneソケットアプリケーションを作成しました。Linux [Ubuntu]サーバーと通信している間、クライアントおよびサーバーとして機能します。GCDAsyncUdpSocketを使用してデータを送受信しています。Macbookには、ソケット通信アプリケーションをテスト/検証するためのバックアップサーバー/クライアントアプリケーションもあります。Linux[Ubuntu]サーバーのように機能します。それは完璧に動作します。

問題:Linux[Ubuntu]サーバーからデータを受信できません。

詳細:Linuxサーバーにデータを正常に送信でき、そのデータに反応/処理します。しかし、サーバーが応答またはエコーを送信すると、私のiPhoneアプリはそれを表示/読み取ることができません。私がAndroidの同僚と開発した同様のアプリケーションは、サーバーからのデータの読み取り/表示を行います。以下のコードをご覧ください。乾杯!

これはそのためのコードです:.mファイル:

-(void)viewDidLoad
{
    [super viewDidLoad];
    backGround.userInteractionEnabled=YES;  
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    NSError *error = nil;
    if (![udpSocket bindToPort:0 error:&error]) //check ff of dit werkt!
    {
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        return;
    }
}


- (IBAction)sendData:(id)sender 
{
    NSString *msg = messageField.text;
    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
    [self sendingRealData:data];
}

-(void)sendingRealData:(NSData *) Content
{
    NSString *msg = [[NSString alloc] initWithData:Content encoding:NSUTF8StringEncoding];
    NSLog(@"msg is: %@", msg);
    NSString *host = [self getHost];
    int port = [self getPort]; 

    if ((port == 65536) && (host == @"-1"))
    {
        NSLog(@"Port and IP are not filled in!");
        [self errorManag:2]; 
    }

    else if ((port == 65536) && (host != @"-1"))
    {
        NSLog(@"return was -2");
        [self errorManag:1];
    }

    else if (host == @"-1")
    {
        NSLog(@"return was -1");
        [self errorManag:0]; 
    }

    else 
    {
        [udpSocket sendData:Content toHost:host port:port withTimeout:1 tag:tag];
        NSLog(@"Gestuurd");
    }
}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
  fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
    NSLog(@"niets."); 
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (msg)
{
        NSLog(@"iets gekregen");
}
else
{
    NSLog(@"Error convertion");
    //[self logError:@"Error converting received data into UTF-8 String"];
}
//NSString *test = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//NSLog(@"%@",test); 
//[udpSocket sendData:data toAddress:address withTimeout:-1 tag:0];
    NSLog(@"HMMMM");
    messageField.text = [[NSString alloc] initWithFormat:@"RE: %@", msg]; 
}
4

1 に答える 1

2

このアドバイスは以前に私に与えられたので、ポート:0にバインドするようにViewDidLoadに書き込んだことがわかりました。

これにより、モバイルはポート12345ではなくランダムなポートをリッスンしました。バインディングをポート12345に変更すると、機能します。

于 2012-05-08T09:24:07.883 に答える