进入第六天,今天主要解决以下问题:
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语言字符串结束符)分隔的字串。
以上两个函数在目标串中搜索分号,遇到第一个字符串结束标志,没有找到分号,直接返回,分隔失败。
后来使用挨个字符比较的方式对目标内存进行处理,才把真正的字串分离出来。
糊里糊涂写程序,想当然写程序,简直是我的两大特长。