簡體   English   中英

OS X:如何使用NSRunLoop監視套接字讀取事件?

[英]OS X: how to watch socket read events with NSRunLoop?

我正在編寫可可應用程序。 應用程序中有一個套接字,每當套接字變得可讀時,我都想從套接字讀取數據,處理數據並相應地更新用戶界面。 我想將讀取事件檢查集成到主循環中,即,我想將套接字附加到主循環,並且只要該套接字變得可讀,就讓主循環調用回調。

我已經編寫了一個測試應用程序,但是由於某種原因它無法正常工作:

#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對象可以用作分布式對象連接的端點。

那不是你在這里做什么。

你要 來自BSD套接字API的套接字文件描述符周圍的NSFileHandle ,或 一個CFSocket 這將使您將套接字置於運行循環中。

您想以自己的方式使用NSSocketPort ,然后創建一個NSFileHandle來接受套接字上的連接。 您可以按預期在主線程上獲取回調,首先是新連接,然后是這些連接上的數據。 使用這篇O'Reilly文章,而忽略HTTP內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM