1, 最近使用android 调试, tcp udp 接收出现了 很大问题, 占用了非常长的时间, 最后把代码一步步退回之前, 才发现用来是 在 接收 数据时分布导致,如果在windows 下, 分段读取, 就会阻碍tcp 消息接收, 在linux 下 (android)下, 就没有相应的问题, 原因暂且不清楚
int CustormSocketHelper::download_recv(int sockfd, char *data, int len, int mode, int timeout)
{
int read_size = 0;
int result = 0;
fd_set fds;
struct timeval out; //默认100毫秒等待,要非阻塞就置0
int can_read = 0;
//容错判断
if ((data == NULL) || (sockfd <= 0))
{
cocos2d::log(" netlog CustormSocketHelper::download_recv return -1 data: %s, sockfd: %d " , data, sockfd);
return -1;
}
//超时时间
if (mode == 1)
{
out.tv_sec = 0;
out.tv_usec = timeout * 1000; //毫秒级
cocos2d::log(" netlog CustormSocketHelper::download_recv timeout set out.tv_sec: %d, out.tv_usec: %d ", out.tv_sec, out.tv_usec);
}
//读取数据
while (read_size<len)
{
cocos2d::log(" netlog CustormSocketHelper::download_recv in while read_size: %d len:%d ", read_size, len);
if (mode == 1) //select模式
{
can_read = 0;
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sockfd, &fds); //添加描述符
cocos2d::log("netlog CustormSocketHelper::download_recv in switch sockfd: %d", sockfd);
int switchIndex = select(sockfd + 1, &fds, NULL, NULL, &out);
cocos2d::log("netlog CustormSocketHelper::download_recv switchIndex: %d", switchIndex);
switch (switchIndex) //select使用
{
case -1: //select错误,退出程序
{
cocos2d::log("netlog CustormSocketHelper::download_recv case -1 : read_size: %d", read_size);
if (read_size>0) //之前已经读到数据
{
return read_size;
}
else
{
return -1; //error
}
break;
}
case 0: //超时
{
if (read_size>0) //之前已经读到数据
{
return read_size;
}
else
{
return -2; //超时
}
break;
}
default:
{
if (FD_ISSET(sockfd, &fds)) //测试sock是否可读,即是否网络上有数据
{
cocos2d::log("netlog CustormSocketHelper::download_recv if (FD_ISSET(sockfd, &fds))");
can_read = 1;
}
else //返回0,即socket描述符不在字符集中
{
if (read_size>0)
{
return read_size;
}
else
{
return -1;
}
}
break;
}
}//switch End
}
else //非select模式,直接读取数据
{
can_read = 1;
}
//可以读取数据
if (can_read == 1)
{
result = recv(sockfd, data + read_size, len - read_size, 0);
cocos2d::log("netlog CustormSocketHelper::download_recv can_read == 1 , result: %d", result);
if (result>0)
{
read_size += result;
}
else
{
if (read_size>0)
{
return read_size; //未读到指定长度数据,返回实际读到的字节数
}
else
{
return -3; //recv 错误肯能是-1,0 -3直接代表是recv而非select错误
}
}
}
}//while End
return read_size;
}
2, 在android下安卓apk, 如果eclipse 提示install failed,而工程编译生成apk都没问题, 可能是之前的apk没有卸载的原因。
3, 如果提示 adt/arm 之类的, 可以考虑删除 obj文件夹下的所有库, 然后重新编译一下