我正在写一个 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 对象可以用作分布式对象连接的端点。

那不是你在这里做的事。

你要 任何一个 NS文件句柄 来自 BSD 套接字 API 的套接字文件描述符,或者 A CFSocket. 。这将使您将套接字置于运行循环中。

其他提示

您想使用NSSocketPort在你正在做的方式,但然后创建一个NSFileHandle接受套接字上的连接。你可以得到的,就像您期望,首先为新的连接,然后这些连接上的数据在主线程上的回调。使用此的 O'Reilly的文章和只是忽略HTTP东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top