GCDAsyncc socket dispose中的SSLDisposeContext,SSLNewContext,该怎么解决

用GCDAsyncSocket解决AsyncSocket读取数据时丢失部分消息
用GCDAsyncSocket解决AsyncSocket读取数据时丢失部分消息
[摘要:文章起源:http://blog.csdn.net/cdy2143/article/details/8963422
正在项目中,不停皆是用AsyncSocket的开源项目去做IOS的Socket的开辟,目前碰到一个题目:当数据包比拟频仍的]
文章来源:http://blog.csdn.net/cdy2143/article/details/8963422
在项目中,一直都是用AsyncSocket的开源项目来做IOS的Socket的开发,现在遇到一个问题:当数据包比较频繁的发送到手机时,即使使用了readDataToData,还是会出现丢包的问题且读到的包中还会出现分割符。后面终于参考了其他的文章,看到GCDAsyncSocket,结果试了一把,readDataToData,能正常分割数据,即按行来分,且不丢包了。
使用GCDAsyncSocket的方法如下:
1、/robbiehanson/CocoaAsyncSocket,从这个地址,将GCD目录下的GCDAsyncSocket.h和GCDAsyncSocket.m文件下载下来,添加到你的项目中,然后,在引入CFNetwork.framework和Security.framework,如下图:
2、使用代码
[plain]&view
3、附上从网络上取得到数据包后,自己用分割符来分割数据,如用换行符号分割数据包
[plain]&view
IThao123周刊主题 : GCDAsyncSocket + ssl验证
级别: 新手上路
可可豆: 63 CB
威望: 65 点
在线时间: 151(时)
发自: Web Page
来源于&&分类
GCDAsyncSocket + ssl验证&&&
socket需要加ssl,在stackoverflow查到如下代码,可是在证书验证时 items get no object,下面就crash了。求教有相关经验的进来说说是怎么实现的?[pre]NSMutableDictionary *sslSettings = [[NSMutableDictionary alloc] init];&&&&&&&&NSData *pkcs12data = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@&client& ofType:@&bks&]];&&&&&&&&CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(pkcs12data);&&&&&&&&CFStringRef password = CFSTR(&YOUR PASSWORD&);&&&&&&&&const void *keys[] = { kSecImportExportPassphrase };&&&&&&&&const void *values[] = { password };&&&&&&&&CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);&&&&&&&&CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); //0 object,下一步就出错 OSStatus securityError = SecPKCS12Import(inPKCS12Data, options, &items);&&&&&&&&CFRelease(options);&&&&&&&&CFRelease(password);&&&&&&&&if(securityError == errSecSuccess)&&&&&&&&&&&&NSLog(@&Success opening p12 certificate.&);&&&&&&&&CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);&&&&&&&&SecIdentityRef myIdent = (SecIdentityRef)CFDictionaryGetValue(identityDict,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&kSecImportItemIdentity);&&&&&&&&SecIdentityRef&&certArray[1] = { myIdent };&&&&&&&&CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL);&&&&&&&&[sslSettings setObject:(id)CFBridgingRelease(myCerts) forKey:(NSString *)kCFStreamSSLCertificates];&&&&&&&&[sslSettings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel];&&&&&&&&[sslSettings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];&&&&&&&&[sslSettings setObject:@&CONNECTION ADDRESS& forKey:(NSString *)kCFStreamSSLPeerName];&&&&&&&&[sock startTLS:sslSettings];[/pre]
努力做自己喜欢的事情
级别: 新手上路
UID: 194080
可可豆: 61 CB
威望: 21 点
在线时间: 567(时)
发自: Web Page
请问你的文件解决了吗?
级别: 新手上路
UID: 194080
可可豆: 61 CB
威望: 21 点
在线时间: 567(时)
发自: Web Page
回 1楼(zhoujia) 的帖子
问题。。。。
关注本帖(如果有新回复会站内信通知您)
论坛技术问题应该发布到? 正确答案:CocoaChina问答
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版GCDAsyncSocket中的SSLDisposeContext,SSLNewContext,该怎么解决 - Iphone当前位置:& &&&GCDAsyncSocket中的SSLDisposeContext,SSLNewConteGCDAsyncSocket中的SSLDisposeContext,SSLNewContext,该怎么解决&&网友分享于:&&浏览:32次GCDAsyncSocket中的SSLDisposeContext,SSLNewContext提交审核时xcode监测到这两个非法api不给我通过。
第一个我看最新的源码里
#if&TARGET_OS_IPHONE
CFRelease(sslContext);
SSLDisposeContext(sslContext);
我就用CFRelease替换了SSLDisposeContext
SSLNewContext干嘛用的不知道,也不知道能不能注释那段,麻烦了解告诉一下
GCDAsyncSocket开源代码网址
/robbiehanson/CocoaAsyncSocket
涉及这两个函数的文件
/robbiehanson/CocoaAsyncSocket/blob/master/GCD/GCDAsyncSocket.m
------解决方案--------------------你确信你定义了TARGET_OS_IPHONE?&貌似你在编译mac用的版本
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
【问题】我在使用GCDAsyncSocket进行Tcp Socket处理,如果在主程序中,我可以正常处理结果的回调,但我想将Socket的处理封装在一个库中,在该库中完成Socket初始化和信息接收处理,但却发现不知该如何才能触发到回调了?
【代码】如果在主线程中直接这么处理:
GCDAsyncSocket *_
_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
进行连接 Connect
[self._tcpSocket connectToHost:deviceIp onPort:SERVERPORT error:&err]
此时连接成功的回调是可以正常触发的
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
NSLog(@"didConnectToHost call");
但如果我将以上流程放在库中,通过主程序来调用的话,那么didConnectToHost这个回调就没法触发到
我认为是我对_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];这个delegate和delegateQueue理解不够,该如何处理这个地方呢?
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知[转]: 用GCDAsyncSocket解决AsyncSocket读取数据时丢失部分消息
[转]: 用GCDAsyncSocket解决AsyncSocket读取数据时丢失部分消息
原文地址:http://blog.csdn.net/cdy2143/article/details/8963422
在项目中,一直都是用AsyncSocket的开源项目来做IOS的Socket的开发,现在遇到一个问题:当数据包比较频繁的发送到手机时,即使使用了readDataToData,还是会出现丢包的问题且读到的包中还会出现分割符。后面终于参考了其他的文章,看到GCDAsyncSocket,结果试了一把,readDataToData,能正常分割数据,即按行来分,且不丢包了。
使用GCDAsyncSocket的方法如下:
1、/robbiehanson/CocoaAsyncSocket,从这个地址,将GCD目录下的GCDAsyncSocket.h和GCDAsyncSocket.m文件下载下来,添加到你的项目中,然后,在引入CFNetwork.framework和Security.framework,如下图:
2、使用代码
[plain] view plaincopy
//建立连接
-(NSError *)setupConnection {
if (nil == socket)
socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err =
NSLog(@"IP: %@, port:%i",hostAddress,hostPort);
if (![socket connectToHost:hostAddress
onPort:hostPort error:&err]) {
NSLog(@"Connection error : %@",err);
needConnect = YES;
//判断是否是连接的状态
-(BOOL)isConnected {
return socket.isC
//断开连接
-(void)disConnect {
needConnect = NO;
[socket disconnect];
//取得连接
-(void)getConnection {
if (![socket isConnected]) {
[self disConnect];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(setupConnection) userInfo:nil repeats:NO];
NSLog(@"scheduled start");
[self setupConnection];
-(void)sendCMD {
[self getConnection];
NSString* cmd = [[NSString alloc] init];
cmd = [cmd stringByAppendingString:@"BBBB1,zzc,202cb962ac152d234b70,EEEE"];
NSString* cmd = @"BBBB1,zzc,202cb962ac152d234b70,EEEE\n";
NSData *data = [cmd dataUsingEncoding:NSUTF8StringEncoding];
[socket writeData:data withTimeout:20 tag:1];
//socket连接成功后的回调代理
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
NSLog(@"onSocket:%p didConnectToHost:%@ port:%hu", sock, host, port);
[delegate networkConnected];
[self listenData];
//socket连接断开后的回调代理
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
NSLog(@"DisConnetion");
[socket disconnect];
[delegate networkDisconnect];
if (needConnect)
[self getConnection];
//读到数据后的回调代理
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
NSLog(@"receive datas from method 1");
NSLog(@"Data length = %d",[data length]);
[self listenData];
[delegate readData:data];
[self splitData:data];
[self listenData];
-(void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag {
NSLog(@"Reading data length of %d",partialLength);
//发起一个读取的请求,当收到数据时后面的didReadData才能被回调
-(void)listenData {
NSString* sp = @"\n";
NSData* sp_data = [sp dataUsingEncoding:NSUTF8StringEncoding];
[socket readDataToData:[GCDAsyncSocket LFData] withTimeout:-1 tag:1];
[socket readDataWithTimeout:-1 tag:1];
3、付上从网络上取得到数据包后,自己用分割符来分割数据,如用换行符号分割数据包
[plain] view plaincopy
&p class="p1"&NSMutableData&span style="font-family: Arial, Helvetica, sans-"&* restD&/span&&/p&//分割数据包
-(void)splitData:(NSData*)orignal_data {
NSUInteger l = [orignal_data length];
NSLog(@"Data length1 = %d",l);
NSString* sp = @"\n";
NSData* sp_data = [sp dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger sp_length = [sp_data length];
NSUInteger offset = 0;
int line = 0;
while (TRUE) {
NSUInteger index = [self indexOfData:sp_data inData:orignal_data offset:offset];
if (NSNotFound == index) {
if (offset&l) {
NSLog(@"Have data not read");
NSRange range = {offset,l-offset};
NSData* rest = [orignal_data subdataWithRange:range];
if (restData == nil) {
restData = [[NSMutableData alloc] init];
[restData appendData:rest];
NSUInteger length = index + sp_
NSRange range = {offset,length-offset};
NSData* sub = [orignal_data subdataWithRange:range];
if (restData != nil) {
[restData appendData:sub];
[delegate readData:restData];
restData =
NSLog(@"line %d",line++);
[delegate readData:sub];
//查找指定的数据包的位置
- (NSUInteger)indexOfData:(NSData*)needle inData:(NSData*)haystack offset:(NSUInteger)offset
Byte* needleBytes = (Byte*)[needle bytes];
Byte* haystackBytes = (Byte*)[haystack bytes];
// walk the length of the buffer, looking for a byte that matches the start
// we can skip (|needle|-1) bytes at the end, since we can't
// have a match that's shorter than needle itself
for (NSUInteger i= i & [haystack length]-[needle length]+1; i++)
// walk needle's bytes while they still match the bytes of haystack
// if we walk off the end of needle, we found a match
NSUInteger j=0;
while (j & [needle length] && needleBytes[j] == haystackBytes[i+j])
if (j == [needle length])
return NSNotF
发表评论:
TA的最新馆藏

我要回帖

更多关于 c socket dispose 的文章

 

随机推荐