博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx+socketcc配合(转)
阅读量:5786 次
发布时间:2019-06-18

本文共 2286 字,大约阅读时间需要 7 分钟。

有小段时间没写blog了,今儿就说说socketcc的使用。当然和socket配套的线程也会提及,弄socket以及线程pthread时间几乎是新手,所以不对或者要改进的地方请过客多多提及以及修正。

ok。开始先说pthread这个c线程的东西。其实使用方法非常简单:

pthread_t pthread_initSocket,

if ((pthread_create(&pthread_initSocket, NULL, initSocketAndSendData, NULL)) != 0) assert("创建initSocketAndSendData线程失败!");

其中staticvoid* initSocketAndSendData(void* pthread);

就这样 线程跑起来了 所有的动作在initSocketAndSendData完成

接下来是socketcc:

TCPClientSocket* m_socket

//=====================================//

try

{

IPAddress address;

address.SetHostName(serverIp, false);

m_socket = newTCPClientSocket(address,serverPort);

// 设置超时

//structtimeval timeout;

//socklen_t len = sizeof(timeout);

//timeout.tv_sec = OVER_TIME;

//m_socket -> SetSockOpt(SOL_SOCKET, SO_RCVTIMEO, &timeout, len);

cocos2d::CCLog(" - Name : %s\n", (constchar *) address);

cocos2d::CCLog(" - Family : %s\n", (address.GetAddressFamily() == AF_INET6)?"IPv6":

((address.GetAddressFamily() == AF_INET)?"IPv4":"Unknown"));

cocos2d::CCLog(" - Address : %s\n", address.GetAddressString());

} catch (SocketException &excep)

{

cocos2d::CCLog("Socket Exception : %s\n\n", (constchar *) excep);

}

catch (...)

{

cocos2d::CCLog("Other Error\n\n");

}

// socket连接成功

/*创建接收数据的线程*/

if((pthread_create(&pthread_rec, NULL, reciveData, NULL)) != 0) assert("创建线程reciveData失败!");

//==================================//

void* reciveData(void *pth)

{

while (1)

{

CCLog("reciveData");

unsignedchar pcRecvBuf[MAX_RECV_SIZE];

try

{

int iBytesRec = m_socket -> RecvData(pcRecvBuf, MAX_RECV_SIZE);

CCLog("Received %d bytes of data\n", iBytesRec);

pcRecvBuf[iBytesRec] = 0;

//TODO 处理收到的数据

}catch(SocketException &excep)

{

cocos2d::CCLog("recvDatas Error: %s \n\n",(constchar*)excep);

} catch (...)

{

cocos2d::CCLog("recvDatas Error\n\n");

}

}

cocos2d::CCLog("net disconnect \n\n");

}

非 常 非常要注意 采用二进制网络字节接收到的数据非常很有可能一次是不全的 需要两边定义每次发送的数据包的长度 比如每个包的前4个字节int 数据包长度,然后接收的时候 小于4个就存起来 然后收到的每一个包就一直累加包的长度,当长度等于了这个有效包的长度的时候就表示包是完整的 就可以接着处理服务端的数据鸟,关于包的问题,如果是用二进制网络字节来收发就看前面的《c java通信并且实现以java为 准的网络字节转换》就是所谓的unsigned char*数组处理二进制模式的通信,当然你可以收发string类型的封装包比如xml的或者json类型或者自己定义的类型(比如用"."来区分每个 参数接收发送的时候自己封装前提是你的包永远不会出现"."的其他使用)的string。在发送string的时候,记得在最后要添加"./r /n"or"/n"否则貌似会有无法接收到包 是因为这个符号是表示string包的结束标志,实际上是使用readbuff有个readline方法引起的。

转载于:https://www.cnblogs.com/yaokang/archive/2012/05/24/2516746.html

你可能感兴趣的文章
redis 的mq功能演示
查看>>
编码的法则:c++程序员不可不知的101条经验
查看>>
Ubuntu上安装rvm
查看>>
Ubuntu上通过 RVM 安装 多版本 Ruby/Rails
查看>>
Python 监控主机程序,异常后发送邮件(我的第一只Python程序)
查看>>
thinkphp 连接sql server
查看>>
安全狗服云PC端V2.5.1发布 助力服务器安全运维
查看>>
数据库 设计中的英文术语
查看>>
Android Browser学习七 书签历史模块: 书签UI的实现
查看>>
Android如何在测试程序中删除被测应用私有的原始数据
查看>>
php数组去重复数据的小例子
查看>>
【LeetCode】461. Hamming Distance (java实现)
查看>>
删除某个目录及目录下的所有子目录和文件
查看>>
ubuntu 11.10 下network proxy 的设置问题
查看>>
关于新版chrome设置编码格式(55以上)
查看>>
常用正则表达式
查看>>
linux分布式安装hadoop1.2
查看>>
va_start和va_end的使用及原理
查看>>
使用Dockerfile构建自己的etcd镜像
查看>>
第一次面试记录
查看>>