Android底层Linux socket编程踩坑实录
作为一个安卓底层入行一年的菜鸟,领导交给了我一个网络消息中心的任务,这其中需要用到之前没有做过的socket编程,这个帖子就来记录一下我在学习实践的过程中踩到的坑吧~
1. linux的recv
Linux下的socket编程中,recv的上限值是和在windows下的recv的上限值不同的。在win socket编程中,单次recv的上限是可以达到1024x1024字节 也就是1m的。而在Linux中,单次recv1m是会报段错误的。经过试验,Linux单次的recv上限大概在128kb左右。
2. 数据处理byte转字符串
由于之前定的协议不能确定单包的数据上限,所以我在传输数据的时候使用了string的append方法进行数据拼接。在这个情况下就遇到了一个问题,如何将int类型的数字数据转化成16进制的字符串。我在网上搜索了诸多办法进行试验,发现如下问题:
1.使用sprintf,无法将数据按位准确输出,存在多0情况。
2.使用网上的转byte数组,再通过memcpy转char*的方法。发现输出乱码,并无法解析。
最后使用的方法是:将byte数组用memcpy转为unsigned char类型,再将unsigned char强转char*输出到string。
试验结果:虽然输出的str为乱码,但是内容正确读取。
byte p[4