CocoSocket开源下载与编写经验分享

CocoSocket分享



cocos2dx 3.1都出了,但依然没有发现与它原生的SOCKET支持,于是,这几天在家,手工撸了一个。

目前版本对IOS,ANDROID,WINDOWS支持良好。且为异步SOCKET,不需要再开任何线程。

特点
1、异步SOCKET,无需任何线程
2、只有一个头文件,使用方便
3、支持IOS,ANDROID,WINDOWS

下载连接 v0.0.1

下载连接 v0.0.2

 

示例:

//自定义消息处理器
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, 0);
cSocket.connect("192.168.1.7", 8643);

 

各位可以尝试使用,若有什么坑,可以回复此贴,或者来信告诉我,一起完善,谢谢。 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 = 0;
if (sigemptyset(&sa.sa_mask) == -1 ||
    sigaction(SIGPIPE, &sa, 0) == -1)
    {
        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(....);

 

结术语



无。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/p/3745561.html

时间: 2024-09-19 02:04:37

CocoSocket开源下载与编写经验分享的相关文章

微信小程序豆瓣电影项目的改造过程经验分享

在学习微信小程序开发过程中,一部分的难点是前端逻辑的处理,也就是对前端JS的代码编辑:一部分的难点是前端界面的设计展示:本篇随笔基于一个豆瓣电影接口的小程序开源项目进行重新调整,把其中遇到的相关难点和改进的地方进行讨论介绍,希望给大家提供一个参考的思路,本篇随笔是基于前人小程序的项目基础上进行的改进,因此在开篇之前首先对原作者的辛劳致敬及感谢. 1.豆瓣电影接口的小程序项目情况 豆瓣电影接口提供了很多相关的接口给我们使用,豆瓣电影接口的API地址如下所示:https://developers.d

手机APP设计师经验分享:APP用户体验设计

文章描述:实用的经验分享:如何让APP变快! ​做了设计转眼间也4年多了,从2011年由网页设计师转到手机APP设计师:最近的工作不是很忙,就静下心来去阅读学习下互联网的一些发展趋势来弥补自己在这方面的不足(因为工作的时间大部份都是做设计):之前一直以为用户体验方面的工作是有专门的研究人员去做的,与设计人员没有关系,通过这几天的学习,发现做设计的也可以做到用户体验啊,下面我就给大家一一介绍下,大家互相学习 ^_^ 一.后台的执行 核心思想:通过在状态栏运行加载的程序的同时,可以使用户可以做其他的

[精华]web架构设计经验分享!

经验|经验分享|精华|设计|web架构 本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查看视频 架构设计的几个心得: 一,不要过设计:never over design 这是一个常常被提及的话题,但是只要想想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,往往倾向于设计大而化 一的架构,希望设计出具有无比扩展

经验分享提升百度经验通过率的几点心得

seoer都清楚如果要做高质量的外链,那么首选的平台就是百度产品,就像百度空间.百度百科.百度问答.百度贴吧.百度经验等等都是seoer比较喜欢的做质量外链的平台.而这些外链建设的高难度,也使得众多的seoer只能望"链"兴叹,但是其实这些外链的建设只要我们抓住了窍门,也是可以获得不多的收入的. 自去年百度经验上线以来,短短一年,其权重就达到了8,流量达百万级别的,而且这个平台可以做超链接,自然就成为了seoer做外链的首选平台了.当然因为是百度自身的产品,以致于很多时候很难留下链接.

远程接口设计经验分享

远程接口设计经验分享 写在前边 分布式架构是互联网应用的基础架构,很多新人入职以来就开始负责编写和调用阿里的各种远程接口.但如同结婚一般,用对一个正确的接口就如同嫁一个正确的人一样,往往难以那么顺利的实现,或多或少大家都会在这个上边吃亏. 每年双十一系统调用复盘的时候,我都会听到以下声音 你们调我的接口报错了竟然不会自己重试? 我的返回值应该从这里取 我返回isSuccess() == true,不代表业务成功,你还需要判断ERROR_CODE 这个ERROR_CODE没说全部都要重试啊! 这个

运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1677155 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

网站推广方法经验分享-论坛推广

论坛推广优点: 1.能带回高权重的链接: 2.因为目标客户群准确.聚集,能带来更多的潜在用户: 论坛推广缺点: 1.发贴子时限定了直接导出链接: 2.发贴子容易封ID:论坛推广时我们不能盲目,首先要找一个人气旺的论坛,其次找到时面最感兴趣的话题,然后给一个理由,让这些人来浏览你网站上的内容.这里面也有要炒作的意思.不要只是为了发发贴而进论坛.这样想只会让费时间.   一个成功的论坛推广法包括以下几点: 第一.选择论坛 1.人气旺: 2.有自己潜在客户群体: 3.有签名功能,能编写导出链接: 4.

CMOS Sensor的调试经验分享

转自:http://bbs.52rd.com/forum.php?mod=viewthread&tid=276351 CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一些调试经验. 首先,要认识CMOS摄像头的结构.我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头.感应器和图像信号处理器构成.一般情况下,集成好的模组我们只看到外面的镜头.接口和封装壳,这种一般是固定焦距的.有些厂商只提供芯片,需要自己安装镜头,镜头要选择合适大小的镜头,如果没有夜视要求的话,最好

【第二届PHP全球开发者大会】新浪微博移动应用服务高级架构师胡波:微博升级PHP7经验分享

5月14-15日的第二届2016PHP全球开发者大会在北京国际会议中心举行.新浪微博移动应用服务高级架构师胡波带来的分享是<微博升级PHP7经验分享>,他主要介绍了新浪微博在升级PH7时的部署系统.配置优化等过程中的实践经验.   演讲内容结构:    PHP7 新特性    为什么升级PHP7    我们升级的后盾    SLA分析系统    依赖梳理    升级代码    升级系统    灰度部署    配置.优化    成果 关键内容: 为本次大会合作社区,共享报道. PPT下载地址: