在OS X中尝试打开套接字上的写入流时被卡住
Stuck trying to open write stream on socket in OS X
在网上阅读了许多示例后,我尝试编写一个简短的简单程序来测试两台计算机之间的套接字连接。我有这两台电脑
- 客户端,192.168.0.116,运行以下程序
- 服务器,192.168.0.118,正在运行http://sockettest.sourceforge.net/在端口6237上处于服务器侦听模式
我一开始采用了更简单的同步设计,但当它不起作用时,我转向了runloop/async。
症状:CFWriteStreamOpen返回true(成功),但流无限期地保持在kCFStreamStatusOpen状态。回调从未被调用以确认打开已完成(事实上,它从未被调用用于任何事件)。
我怀疑我可能有网络问题(防火墙等),可能会阻止此连接。为了反驳这个理论,我跑了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;
}
您不允许运行循环。
大约在我遇到这个问题并最终发现CFRunLoopRun()必须在CFWriteStreamOpen之后调用3天后。任何地方都没有记录。为那些搜索并稍后找到的人干杯
引用评论以提高可见性。重点是,如果您的CF套接字代码挂起,您可能需要运行您的运行循环。
此外,如果您没有执行run循环&基于回调的API使用模式,即如果您正在使用CFWriteStreamWrite
进行阻塞IO,而没有设置"流客户端",则也可能会由于超时等错误而挂起。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 在OS X中尝试打开套接字上的写入流时被卡住
- 检查mac os x中是否连接了套接字