使用CFSocket的简单异步客户端

时间:2011-10-11 11:53:06

标签: objective-c xcode macos cocoa network-programming

我也熟悉BSD套接字,我是Obj-C和Cocoa的新手,所以请耐心等待:)

我正在尝试的是控制台应用程序中的一个简单的TCP客户端,它只在后台接收数据。我想使用CFSockets,因为方便的回调函数(在自治线程中使用普通套接字实现它不会有问题,但我想以Mac方式执行此操作)。

我遇到的问题是,如何在没有RunLoop的情况下使用回调函数,或者如何使RunLoop以非阻塞方式运行。据我所知,不可能将RunLoop放入GCD(至少我试过它并且循环从不运行)。那有什么选择呢?是否可以在NSThread中运行RunLoop?还有更简单的方法吗?

这是我使用的代码片段。它作为单个任务工作正常。

CFSocketRef TCPClient;
CFSocketContext CTX = { 0, "MYCLIENT", NULL, NULL, NULL };
TCPClient = CFSocketCreate(NULL, PF_INET, SOCK_STREAM, IPPROTO_TCP,
    kCFSocketReadCallBack, (CFSocketCallBack)ConnectCallBack, &CTX);
[...]
CFDataRef connectAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr));
CFSocketConnectToAddress(TCPClient, connectAddr, −1);
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource(kCFAllocatorDefault, TCPClient, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes);
CFRelease(sourceRef);
CFRunLoopRun();

提前致谢! 托马斯

1 个答案:

答案 0 :(得分:0)

我推荐AsyncSocket,一个客观的c轻量级框架(只是几个文件),带有可选的GDC,非常好地以mac方式编码。

  

AsyncSocket是一个TCP / IP套接字网络库,它包装了CFSocket和CFStream。它提供了异步操作,以及一个带有委托支持的本机可可类。

您可以配置它(通过委托方法)以使用当前运行循环或任何其他运行循环。