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牛逼多少多少,反正我刚 ...
随机推荐
- LinuxMM--MemoryHierarchy
MemoryHierarchy 为了理解内核中的页替换算法,有必要认识linux中的存储体系分层架构.访问模式以及混合工作mixed workloads. 存储器分层架构 有两种类型的存储分层架构 ...
- (Python )格式化输出、文件操作、json
本节学习Python的格式化输出,文件操作以及json的简单用法 1.格式化输出 将非字符串类型转换成字符串,可以使用函数:str() 或者repr() ,(这两个函数的区别目前我还没搞懂,求解答) ...
- Oracle数据导入导出
Oracle数据导入导出imp/exp 在oracle安装目录下有EXP.EXE与IMP.EXE这2个文件,他们分别被用来执行数据库的导入导出.所以Oracle数据导入导出imp/exp就相当与ora ...
- python 跨模块实现按照文件大小,日期实现日志分割,反转
笔者的一个自动化测试平台项目,采用了python作为后端服务器语言.项目基于快速成型目的,写了一个极其简陋的日志记录功能,支持日志记录到文件和支持根据日志级别在终端打印不同颜色的log.但随着测试平台 ...
- C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用)
C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用) 简单代码,记录一下.一个BackgroundWorker控件 backgroundWorkerRefr ...
- REST,RESTful
REST(Representational State Transfer)描述了一个架构样式的网络系统. RESTful架构,就是目前最流行的一种互联网软件架构.结构清晰.符合标准.易于理解.扩展方便 ...
- Number of 1 Bits
class Solution { public: int hammingWeight(uint32_t n) { string aaa = toBinary(n); ; ; i < sizeof ...
- Java实现四则运算,使用堆栈,检查语法
突然发闲想试一试自己实现算术的四则运算,支持加减乘除和括号.正负号:支持语法检查:思路很常规,利用两个堆栈,一个压操作符,一个压操作数,念头冒出来之后,立马动手:然后本以为很容易的一个实现,却存在各种 ...
- Ajax异步调用Controller的Return JsonResult生成下拉列表
@using System.Web.Optimization; @{ Layout = null; } <!DOCTYPE html> <html> <head> ...
- C++ 非阻塞套接字的使用 (1)
在维护代码的过程中,发现软件运行的CPU占用率居高不下,在4核的电脑上占用了25%的CPU.查阅资料的得知,这是可能是由于软件中出现了死循环. 经过对软件的一些测试,最终确定了死循环出现的位置——通讯 ...