关于ios中CFSocket问题

qianlima210210 2018-04-15 09:07:01
各位老师,我在公司看到一份使用CFSocket实现的IM通信代码,里面有段代码不太理解,请帮忙看下。

先提下代码是如何组织字节流作为发送内容
1、向外发数据时,代码在消息内容的末尾添加消息结束符‘\0’,然后调用CFSocket发送出去
char symbol = '\0';
[data appendBytes: &_messageendsymbol length:1];//data是NSMutableData类型

2、接收时,因为是如下创建CFSocket的
- (void)createSocket {
CFSocketContext sockContent = {0, self, nil, nil, nil};
_socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketDataCallBack, socketHandel, &sockContent);

CFSocketSetSocketFlags(_socket, (CFSocketGetSocketFlags(_socket) & ~kCFSocketAutomaticallyReenableReadCallBack & ~kCFSocketAutomaticallyReenableWriteCallBack) | kCFSocketAutomaticallyReenableDataCallBack);

CFRunLoopSourceRef sourceLoop = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0);
CFRunLoopAddSource([_runLoop getCFRunLoop], sourceLoop, kCFRunLoopDefaultMode);
CFRelease(sourceLoop);
}

static void socketHandel(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
MySocket *socket = (MySocket*)info;
if (s == nil)
return;

switch (type) {
case kCFSocketDataCallBack:
if (CFDataGetLength(data) != 0)
[socket processRead:data];//问题就在这里,在测试及目前线上运营,data并没出现粘包问题。这是为什么?和‘\0’有关系吗?kCFSocketDataCallBack触发时机是?
else
[socket processDisconnected];
break;
default:
break;
}
}



...全文
881 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧