关于ios中CFSocket问题
各位老师,我在公司看到一份使用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;
}
}