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牛逼多少多少,反正我刚 ...
随机推荐
- 在Xcode中使用Git进行源码版本控制
http://www.cocoachina.com/ios/20140524/8536.html 资讯 论坛 代码 工具 招聘 CVP 外快 博客new 登录| 注册 iOS开发 Swift Ap ...
- CodeSmith Generator 7.0.2激活步骤
地址是:http://www.cnblogs.com/dunitian/p/4096917.html
- 结构化查询语言(SQL)数据类型
简要描述一下结构化查询语言中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型. 字符型 VARCHARVS CHAR VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要.他们都是用 ...
- 如何辨别具体的一种SaaS是否安全?
如何辨别具体的一种SaaS是否安全,需要把握以下几点: 1.传输协议加密 首先,要看SaaS产品提供使用的协议,是https://还是一般的http://,别小看这个s,这表明所有的数据在传输过程中都 ...
- BZOJ1742[Usaco2005 nov]Grazing on the Run
Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...
- 在Windows7 下调试CodeSmith 注意事项
编写CodeSmith模板和编写程序一样,也需要进行调试,CodeSmith支持使用CLR’s Just-in-Time debugger调试模板. 要调试模板,首先要在CodeTemplate声明中 ...
- 浅谈城市规划在移动GIS方面的应用发展
1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...
- iOS游戏截图或广告图尺寸要求
统一的标准:72 dpi,RGB,扁平化,非透明,高质量的JPEG或者PNG文件格式 ====================================================== 3. ...
- [机器学习] 在茫茫人海中发现相似的你:实现局部敏感哈希(LSH)并应用于文档检索
简介 局部敏感哈希(Locality Sensitive Hasing)是一种近邻搜索模型,由斯坦福大学的Mose Charikar提出.我们用一种随机投影(Random Projection)的方式 ...
- 介绍一些chrome 好用的插件和快捷键
1.AdBlock ★★★ 最受欢迎的Google 浏览器扩充功能,拥有超过8 百万位使用者!阻挡网路上所有的广告. 2.印象笔记 -剪裁 无需多说! 3.豆藤 Bean vine ★★★★ 豆瓣有此 ...