另外,我对BSD套接字也很熟悉,我对Obj和Cocoa都很陌生,所以请容忍我:)
我正在尝试的是控制台应用程序中的一个简单的TCP客户机,它只是在后台接收数据。我想为此使用CFSockets,因为它具有方便的回调函数(使用自治线程中的普通套接字实现它不是问题,但我想用Mac方式来实现)。
我被困住的地方是,如何在没有RunLoop的情况下使用回调函数,或者如何使RunLoop以非阻塞方式运行。据我所知,不可能将RunLoop放入GCD中(至少我尝试过,循环永远不会运行)。那么有什么可供选择的呢?可以在RunLoop中运行NSThread吗?还有更简单的方法吗?
下面是我使用的代码片段。它作为一项任务工作很好。
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();提前感谢!托马斯
发布于 2011-10-11 12:24:56
我推荐AsyncSocket,一个目标c轻量级框架(仅几个文件),带有可选的GDC,非常好地用mac方式编码。
AsyncSocket是一个封装CFSocket和CFStream的TCP/IP套接字网络库。它提供异步操作,并提供带有委托支持的原生可可类。
您可以(通过委托方法)将其配置为使用当前run循环或任何其他run循环。
https://stackoverflow.com/questions/7725617
复制相似问题