在在线阅读了许多示例之后,我试图编写一个简短的简单程序来测试两台计算机之间的套接字连接。我有这两台电脑
我从一个甚至更简单的同步设计开始,但是当它不起作用时移到了runloop / async。
症状:CFWriteStreamOpen返回true(成功),但是流无限期保持在kCFStreamStatusOpening状态。从不调用回调来确认打开是否完成(实际上,从未为任何事件调用该回调)。
我怀疑我可能因某种网络问题(防火墙等)而无法连接。为了证明这一理论,我也在客户端上运行了http://sockettest.sourceforge.net/,并且客户端和服务器之间的连接良好。
#include <iostream>
#include <CoreFoundation/CFStream.h>
using namespace std;
CFStreamClientContext myContext = {0,NULL,NULL,NULL,NULL};
#define SA_HOST "192.168.0.118"
//#define SA_HOST "127.0.0.1"
#define SA_PORT 6237
UInt8 buf[5] = { 0, 1, 2, 3, 4 };
UInt8 *wp = buf;
UInt16 bytesQueued = 5;
UInt16 bytesSent = 0;
static const CFOptionFlags kWriteStreamEvents =
kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred |
kCFStreamEventCanAcceptBytes |
kCFStreamEventOpenCompleted |
kCFStreamEventNone;
void WriteStreamCB(CFWriteStreamRef writeStream, CFStreamEventType event, void *clientCallBackInfo)
{
switch (event)
{
case kCFStreamEventEndEncountered:
{
cout << "in CallBack: kCFStreamEventEndEncounteredd" << endl;
CFWriteStreamClose(writeStream);
break;
}
case kCFStreamEventErrorOccurred:
{
cout << "in CallBack: kCFStreamEventErrorOccurred" << endl;
CFStreamError err = CFWriteStreamGetError(writeStream);
cout << "in Callback: stream error, domain: " << err.domain << ", value: " << err.error << endl;
break;
}
case kCFStreamEventCanAcceptBytes:
{
cout << "in CallBack: kCFStreamEventCanAcceptBytes" << endl;
bytesSent = CFWriteStreamWrite(writeStream, buf, 5);
if (bytesSent > 0)
{
bytesQueued -= bytesSent;
wp += bytesSent;
cout << "CFWriteStreamWrite wrote " << bytesSent << " bytes, " << bytesQueued << " left" << endl;
}
else
{
cout << "CFWriteStreamWrite returned " << bytesSent << endl;
}
break;
}
case kCFStreamEventNone:
{
cout << "in CallBack: kCFStreamEventNone" << endl;
break;
}
case kCFStreamEventOpenCompleted:
{
cout << "in CallBack: kCFStreamEventNone" << endl;
break;
}
}
}
int main(int argc, const char * argv[]) {
CFWriteStreamRef writeStream;
CFStringRef host = CFSTR(SA_HOST);
UInt32 port = SA_PORT;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, NULL, &writeStream);
CFWriteStreamSetClient(writeStream, kWriteStreamEvents, WriteStreamCB, &myContext);
CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
if (!CFWriteStreamOpen(writeStream))
{
return -1;
}
while (true);
return 0;
}
您不允许运行循环运行。
。
〜我遇到此问题3天后,终于发现CFRunLoopRun()必须称为AFTER CFWriteStreamOpen。没有记录在任何地方。为那些以后搜寻并找到它的人加油
引用评论以提高知名度。关键是,如果您的CF套接字代码已挂起,则可能需要运行您的运行循环。