Pergunta

Estou tentando fazer um programa para iPhone em execução no simulador. Meu problema é receber dados UDP. Eu uso asyncudpSocket. Se eu fizer um soquete e usar sendData:(NSData) toHost:, ... bem, funciona bem.

O pensamento que eu simplesmente não consigo descobrir é como as funções de recebimento funcionam.

Eu presumo que algo assim:

socket = [[AsyncUdpSocket alloc] initWithDelegate:self];
[socket bindToPort:8000] error:nil] //returns YES
[socket receiveWithTimeout:-1 tag:1];  

Eu acredito que deveria então chamar o método -(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long) fromHost:(NSString *)host port:(UInt16)port

Bem, eu coloquei um nslog nesse método e ele nunca é chamado. Bem [recebimento de soquete, ..] é o único método de recebimento, então acho que deve ser esse ... ou existe outro método que eu tenho que usar? Ou eu tenho que fazer algumas adições ao meu delegado ou o que quer que seja ... eu simplesmente não consigo descobrir como tenho que fazer isso

Eu procurei pelo (s) exemplo (s) de AsyncudpSocket (s), tutoriais, como fazer ('s) e mais, mas não consigo encontrar um exemplo. Portanto, se alguém quiser explicar ou conhecer uma sessão com uma boa explicação, seria muito apreciado.

Se você não sabe a resposta, obrigado pela leitura!

Foi útil?

Solução

Eu sou novo com o objetivo C (então, tenha a minha ignorância), mas pude fazer com que o AsyncudPsocketDelegate receba, na maioria das vezes. Algumas coisas para tentar/confirmar:

  1. Verifique se o self Classe que você está inicializando, pois seu delegado de soquete é a classe em que você está esperando os retornos de chamada.

  2. Certifique -se de que sua classe adote o AsyncUdpSocketDelegate protocolo. Não tenho certeza se isso é realmente necessário, mas não poderia doer. No cabeçalho da sua classe, parece:

    @interface |your class| : |super class| <|Other protocol(s)|, AsyncUdpSocketDelegate> {

  3. Certifique -se de ter seus métodos de delegado declarados em seu interface e implementação. A assinatura do método deve ficar assim:- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port;

  4. Tente ligar receiveWithTimeout com um valor de tempo limite diferente de zero. Pode dar a você resultados diferentes.

  5. Use o Wireshark para garantir que você esteja recebendo dados UDP quando e onde pensa que está. Não estou tentando insultar sua inteligência, mas passei um bom tempo tentando rastrear bugs de código de rede no passado, quando o problema era realmente a minha configuração de rede.

Outras dicas

AsyncUdpSocket *socket=[[AsyncUdpSocket alloc]initWithDelegate:self];    
//receiveWithTimeout is necessary or you won't receive anything
[socket receiveWithTimeout:-1 tag:2]; //-------here
NSData *data=[@"Hello from iPhone" dataUsingEncoding:NSUTF8StringEncoding];
[socket sendData:data toHost:bchost port:9003 withTimeout:-1 tag:1];

Não tenho certeza se isso será útil, mas eu tive o mesmo problema, e aqui está como eu o corrigi.

No meu caso, o problema era que:

[self.socket receiveWithTimeout:-1 tag:0];

estava localizado no lugar "errado".

Se você ligar self.socket Receberwithtimeout: -1 tag: 0]; no método DidfinishlaunchingWithOptions, o soquete não funcionará, independentemente do que você faz (mesmo se você tentar lançá -lo em um novo thread). Para corrigir esse problema, eu fiz um botão e mova o Receba com tempo Ligue para um método chamado quando o botão é clicado. Meu palpite é que o AsyncudPsocket não gosta de algo sobre o manuseio de fios DidfinishlaunchingWithOptions.

Publiquei meu código de exemplo de trabalho abaixo (usando o Xcode 5.1.1). Estes são os arquivos completos do AppDelegate para o meu projeto Xcode.

AppDelegate.h

#import <UIKit/UIKit.h>
#import "AsyncUdpSocket.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate, AsyncUdpSocketDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) AsyncUdpSocket *udpSocket;
@property (strong, nonatomic) UILabel *receiver;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "AsyncUdpSocket.h"
#import <UIKit/UIKit.h>
#import <CFNetwork/CFNetwork.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Create the main window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    // Create a label for showing received text
    self.receiver = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 80.0)];
    self.receiver.text  = @"No message, yet!";
    self.receiver.textColor       = [UIColor blackColor];
    [self.window addSubview:self.receiver];

    // Create a button for sending messages
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setFrame:CGRectMake(80.0, 210.0, 160.0, 40.0)];
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"Start Game" forState:UIControlStateNormal];
    [button setBackgroundColor:[UIColor blueColor]];
    [self.window addSubview:button];

    @try {
        self.udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];
        if (![self.serverSocket bindToPort:9003 error:nil]) {
            NSLog(@"COULD NOT BIND TO PORT");
        }
        if (![self.udpSocket enableBroadcast:YES error:nil]) {
            NSLog(@"COULD NOT ENABLE BROADCASTING");
        }
    } @catch (NSException * e) {
        NSLog(@"Exception: %@", e);
    }
    return YES;
}

- (void)buttonClick:(UIButton*)button {
    NSData * data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
    [self.udpSocket receiveWithTimeout:-1 tag:0];
    if (![self.udpSocket sendData:data toHost:@"127.0.0.1" port:9003 withTimeout:0.2 tag:1]) {
        NSLog(@"COULD NOT SEND DATA");
    } else {
        NSLog(@"Sent packet (from %@:%d to 127.0.0.1:9001)", self.udpSocket.localHost, self.udpSocket.localPort);
    }
}

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port {
    NSLog(@"    Received data (from %@:%d) - %@", host, port, data);
    self.receiver.text = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    [self.udpSocket receiveWithTimeout:-1 tag:0];

    return YES;
}

@end

Espero que isto seja útil para alguém.

Não estou familiarizado com esta biblioteca, mas observar o código de exemplo do projeto do Google Code revela algumas coisas.

Primeiro, não vejo nenhuma menção a esse retorno de chamada que você descreve. Parece que você deveria implementar:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

Também no exemplo, o servidor é iniciado com a seguinte linha:

[listenSocket acceptOnPort:port error:&error]

Aqui está um link para o Código de amostra.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top