iPhone客户端开发笔记(六)

进入第六天,今天主要解决以下问题:

1,调试UDP广播自动发现网关IP。

2,调试双连接并发登录网关。

3,调试网关反馈场景数据的拆解。

4,调试场景名称和类型的刷新。

5,调试自动登录、界面切换功能。

1,obj-c中的self并非c++中的this。

in interface “NetStreamMgr”:

+(void) detectingIharbor{

AsyncUdpSocket * udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];

通过udpSocket发送UDP广播;

}

下面的回调函数,也定义在NetStreamMgr中,收到广播回复后会被调用:

-(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(uint16_t)port{

}

对于“静态方法”detectingIharbor,这里面的self到底指的是谁?

[NetStreamMgr detectingIharbor]; // 成功执行,但收不到回馈,亦即进入不到onUdpSocket中。

将“静态方法”换成非静态,并这样调用:

NetStreamMgr * mgr = [NetStreamMgr alloc] init];

[mgr detectingIharbor];               // 成功执行,并且能收到反馈。

2,将GB2312编码字串转换为UTF8。

NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

NSString * converted = [NSString stringWithCString: originalBuffer encoding:enc];

核心在enc的获取。NS库中没有gb编码的定义(反而有日文编码定义),必须从另一个库的编码转换过来。

CFStringConvertEncodingToNSStringEncoding函数参数还有个叫kCFStringEncodingGB_2312…,用这个就不行。留存疑问。

3,对协议缓冲区进行处理。

在对自定义协议进行处理时,使用NSString的-componentsSeparatedByString分割字串,失败,仍然把整串返回。

再使用strtok_r也不行,最后才恍然大悟:

目标串并非真的字符串,而是以‘;’(分号)分隔,分号内又是一个个以’\0’(C语言字符串结束符)分隔的字串。

以上两个函数在目标串中搜索分号,遇到第一个字符串结束标志,没有找到分号,直接返回,分隔失败。

后来使用挨个字符比较的方式对目标内存进行处理,才把真正的字串分离出来。

糊里糊涂写程序,想当然写程序,简直是我的两大特长。

原文地址:https://www.cnblogs.com/tara/p/2363398.html