CocoSocket开源下载与编写经验分享
CocoSocket分享
cocos2dx 3.1都出了,但依然没有发现与它原生的SOCKET支持,于是,这几天在家,手工撸了一个。
目前版本对IOS,ANDROID,WINDOWS支持良好。且为异步SOCKET,不需要再开任何线程。
特点
1、异步SOCKET,无需任何线程
2、只有一个头文件,使用方便
3、支持IOS,ANDROID,WINDOWS
下载连接 v0.0.1
示例:
//自定义消息处理器
class CSessionHandler :public ISocketHandler
{
virtual void onConnected()
{
printf("connected.\n");
} virtual void onConnectFailed()
{
printf("connect failed.\n");
} virtual void onMessage(const char* msg, int len)
{
printf("%s",msg);
} virtual void onDisconnected()
{
printf("disconnected.\n");
}
}; //使用
CSessionHandler oo;
CocoSocket cSocket;
cSocket.setHandler(&oo);
cSocket.create(AF_INET, SOCK_STREAM, );
cSocket.connect("192.168.1.7", );
各位可以尝试使用,若有什么坑,可以回复此贴,或者来信告诉我,一起完善,谢谢。 GMAIL:boyuegame
遇上的问题
由于对socket和select不是太熟悉,那先说说遇上的坑吧。
1、WINDOWS上的返回错误码与IOS,ANDROID不一样。
这才是最坑爹的,因此,不得不重新定义。 好在每一种返回,表示OK的就那一个两个,其它都无视,还算好搞。
2、非阻塞的SOCKET在进行connect的时候,成功与失败的判定问题
POSIX有一个规则,就是当connect成功的时候, 可写,当connect失败的时候,即可读又可写。
但这并不能作为判定标准,因为当SOCKET连接成功,服务器有数据过来的时候,也会变成即可读,又可写。
WINDOWS下并没有遵守这个规则, 通过MSDN的查看,才发现,在WDINWOS上,当connect连接成功时,可写,当连接失败时,是通过fd_set* error返回的。 因此,在WINDOWS上就很容易处理。
那在LINUX和MAC下如何呢。 LINUX和UNIX的 MAN PAGE上介绍是通过getsocketopt的返回值才判定。 还有一种是尝试再次connect,看是否返回值为EISCONN来判定。 网上有一篇贴子说这在LINUX下不靠谱,所以我就没有尝试。
转而,使用另一个规则。
不管是connect成功还是失败,总是可写的。所以,当可写的时候,我们尝试从缓冲区里read 0字节,如果返回值为0,则表示连接成功,如果返回-1,那肯定就是连接失败了。 这个在IOS和ANDROID下工作良好。
3、网上很多人说 recv(fd,buf,buf_len,MSG_NOSIGNAL)可以防止SIGPIPE信号的产生
这简直就是放屁,看看最后一个参数的意思吧。
4、如何正确忽略SIGPIPE信号
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sa.sa_flags = ;
if (sigemptyset(&sa.sa_mask) == - ||
sigaction(SIGPIPE, &sa, ) == -)
{
perror("failed to ignore SIGPIPE; sigaction");
exit(EXIT_FAILURE);
}
}
由于在WINDOWS上,要进行SOCKET SETUP,在ANDOIRD,IOS上,要进行SIGPIPE忽略,所以我弄了一个SocketPrepare类,当有SOCKET初始化的时候,构造一个静态对象,比较方便。 避免CPP依赖,所有东西,都放到了.H里。
5、ANDROID
ANDROID上面,检测是否连接成功,还是得用getsockopt,但连接失败的检查不是太容易。
新增的超时检查,可以用于任意平台的连接失败检查。毕竟游戏里面,都是会做连接超时的。
由于我希望外面使用干净,所以,我使用了cocos的shcedule来调度事件检测,这样就隐藏了Reactor 外面使用只需要这样。
//实现自己的消息Handler
class MyHandler:public ISocketHandler
{
//实现方法
} //如何使用
//实例化一个CocoSocket
CocoSocket socket;
//实例化一个Handler
MyHandler handler;
//绑定
socket.setHandler(&handler);
//分配Socket系统资源
socket.create(...);
//连接目标地址
socket.connect(....);
结术语
无。
CocoSocket开源下载与编写经验分享的更多相关文章
- 鸿蒙系统开源学习经验分享HarmonyOS[www.allharmonyos.com]
分享鸿蒙系统开源知识,分享学习经验,分享鸿蒙系统开发经验 www.allharmonyos.com https://gitee.com/allharmonyos https://github.com/ ...
- android平台短视频技术之 视频编辑的经验分享.
android平台短视频技术之 视频编辑的经验分享. 提示一: 各位看官,这里分享的是视频编辑,即剪切/拼接/分离/合并/涂鸦/标记/叠加/滤镜等对视频的编辑操作.不是流媒体网络播放等功能,请注意. ...
- 经验分享:如何用grep对PHP进行代码审计
这是一个常见的误解- 企业需要购买复杂和昂贵的软件来发现应用程序中安全漏洞:而这些专门的软件应用程序,无论是黑盒或白盒,开源或商业,都能很快的发现安全漏洞. 事实是:所有这些专业的漏洞扫描工具都有其特 ...
- 沉淀,再出发——在Ubuntu Kylin15.04中配置Hadoop单机/伪分布式系统经验分享
在Ubuntu Kylin15.04中配置Hadoop单机/伪分布式系统经验分享 一.工作准备 首先,明确工作的重心,在Ubuntu Kylin15.04中配置Hadoop集群,这里我是用的双系统中的 ...
- 使用latex撰写博士,硕士学位论文(浙大博士经验分享)
使用latex撰写博士,硕士学位论文(浙大博士经验分享) 浙大博士: 个人感觉,还是要用latex来写.因为之前发过几篇word排版的中文论文,在参考文献的引用.文字格式调整上,实在是难受.如果坚持 ...
- 来自IOS开发工程师的零基础自学HTML5经验分享
移动互联网的火爆,而Html具有跨平台.开发快的优势,越来越受到开发者的青睐.感谢IOS开发工程师“小木___Boy”’带来的HTML5学习经验分享. 一.学习途径 1.很多视频网站 比如慕课.和极客 ...
- Unity多媒体展示项目经验分享-ImageEffect+动态绑定
Unity多媒体展示项目经验分享-ImageEffect+动态绑定+网络通信 <ignore_js_op> “海尔科技展墙”是去年年初我们为上海家电博览会制作的一个多媒体展项,有限的工期以 ...
- 干货|Dubbo社区开发者日经验分享
Hello,各位小伙伴大家好,我是小栈君,昨天也就是2019年10月26日,有幸在成都参加了由阿里举办的"Dubbo社区开发者日". 本次活动汇聚了各方面的大神欢聚一堂,主要是对现 ...
- 【原创经验分享】JQuery(Ajax)调用WCF服务
最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...
随机推荐
- exe文件放在其他位置
set PATH=%PATH%;%UGII_ROOT_DIR%call "E:\ZY\exe\uds_rename_parts_mohao.exe"E:\ZY\exe\uds_re ...
- jquery双击事件
<html> <head><meta http-equiv="Content-Type" content="text/html; chars ...
- 1214 - Large Division -- LightOj(大数取余)
http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...
- button、label、textfield、页面跳转、传值
.AppDelegate.m #import “OneViewController.h” //一打开就运行的 -(BOOL)application:(UIApplication *)applicati ...
- c#制作计算器全过程
前言: 网上看的计算器制作只有代码,没有为全过程下面贴图,所以我在下面主要是贴图,让大家零基础制作计算器. 我的环境是visual studio 2010,其他版本例如2008,2012 都可以 1. ...
- Linux三剑客之awk
awk awk是linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等.他读取输出,或者文件的方式是 ...
- 关于angular的一些新手容易忽略的小知识点
1.解决页面刚加载时使用{{name}}这种方式绑定数据会有一瞬间的表达式显示的问题 方法一: 使用ng-bind来绑定数据, 方法二: 添加ng-cloak指令:如 <div ng-app ...
- VMware克隆虚拟机,克隆机网卡启动不了解决方案
Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interfac ...
- Python 类的命名空间
Python中类的定义其实就是执行代码块: class cc: a=0 print '+++++', print a 会直接执行print语句而不是在实例化cc时执行.执行后会生成对应的类的命名空间. ...
- iscroll.js 移动端手触滚动效果。
function loaded() { var myscroll=new iScroll("wrapper",{hScrollbar:false, vScrollbar:fals ...