ОС Х:как смотреть события чтения сокетов с помощью NSRunLoop?

StackOverflow https://stackoverflow.com/questions/2273976

Вопрос

Я пишу приложение Cocoa.В приложении есть сокет, и всякий раз, когда сокет становится доступным для чтения, я хочу прочитать данные из сокета, обработать их и соответствующим образом обновить пользовательский интерфейс.Я хочу интегрировать проверку событий чтения в основной цикл, т.е.Я хочу присоединить сокет к основному циклу и сделать так, чтобы основной цикл вызывал обратный вызов всякий раз, когда этот сокет становится доступным для чтения.

Я написал тестовое приложение, но оно почему-то не работает:

#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;
}

Предполагается, что приложение прослушивает порт 1234 локального хоста, и всякий раз, когда кто-то подключается к серверу или отправляет данные на сервер, приложение должно печатать «Haiz» на консоли.Однако приложение вообще ничего не делает.Сокет создан, и я могу подключиться к порту 1234, но приложение ничего не выводит на консоль.

Что я делаю не так?

Это было полезно?

Решение

Из документации:

Объект NSSocketPort можно использовать в качестве конечной точки для подключений распределенных объектов.

Это не то, что вы здесь делаете.

Вы хотите или Нсфилехандле вокруг дескриптора файла сокета из API сокетов BSD или а CFSocket.Это позволит вам поместить сокет в цикл выполнения.

Другие советы

Вы хотите использовать NSSocketPort так, как вы это делаете, но затем создайте NSFileHandle принимать соединения на сокете.Вы можете получать обратные вызовы в основном потоке, как и ожидали, сначала для новых соединений, а затем для данных об этих соединениях.Использовать это Статья О'Рейли и просто игнорируйте HTTP-материалы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top