Pergunta

Estou escrevendo um aplicativo de cacau. Há um soquete no aplicativo e, sempre que o soquete se torna legível, quero ler dados do soquete, processar os dados e atualizar a interface do usuário de acordo. Quero integrar a verificação do evento de leitura no loop principal, ou seja, eu quero anexar o soquete ao loop principal e fazer com que o loop principal chame um retorno de chamada sempre que esse soquete for legível.

Escrevi um aplicativo de teste, mas por algum motivo não funciona:

#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>

@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end

@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
    printf("Haiz\n");
}
@end

int
main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSSocketPort *server = [NSSocketPort alloc];
    MyDelegate *foo = [MyDelegate alloc];
    [server initWithTCPPort: 1234];
    [server setDelegate: foo];
    [[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
    [[NSRunLoop mainRunLoop] run];
    [pool release];
    return 0;
}

O aplicativo deve ouvir na porta 1234 do localhost e sempre que alguém se conecta ao servidor ou envia dados para o servidor, o aplicativo deve imprimir "Haiz" no console. No entanto, o aplicativo não faz nada. O soquete é criado e eu posso telnet para a porta 1234, mas o aplicativo não imprime nada no console.

O que estou fazendo errado?

Foi útil?

Solução

Da documentação:

Um objeto NSSocketport pode ser usado como um ponto de extremidade para conexões de objeto distribuído.

Não é isso que você está fazendo aqui.

Você quer qualquer Nsfilehandle em torno de um descritor de arquivo de soquete da API BSD Sockets, ou uma Cfsocket. Isso permitirá que você coloque o soquete no loop de corrida.

Outras dicas

Você quer usar NSSocketPort da maneira que você está fazendo, mas depois crie um NSFileHandle para aceitar conexões no soquete. Você pode obter retornos de chamada no tópico principal, como você está esperando, primeiro para novas conexões e depois para obter dados sobre essas conexões. Usa isto O'Reilly Artigo E apenas ignore o material HTTP.

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