cocos网络通信php,cocos2d-x 基于BSD Socket网络通讯模块

1. 预备知识: 线程,互斥锁,信号量: // 创建一个线程 int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)( void ), void *restrict arg); // 初始化互斥量 int pthread_mutex_init(pthread_mutex_t *mut

1. 预备知识:

线程,互斥锁,信号量:

//创建一个线程

int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg);

//初始化互斥量

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex-attr_t *mutexattr);

//给互斥量上锁

int pthread_mutex_lock(pthread_mutex_t *mutex);

//给互斥量解锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);

//信号量初始化

int sem_init(sem_t *sem, int pshared, unsigned int value);

//发送信号量

int sem_post(sem_t *sem);

//等待信号量

int sem_wait(sem_t *sem);

注意:cocos2d-x引擎,已经内置pthread库,如下加入条件编译即可:

#ifdef WIN32

#include "../../cocos2dx/platform/third_party/win32/pthread/pthread.h"

#else

#include "pthread.h"

#endif // WIN32

本项目TCP用的是ODSocket,直接加入ODSocket.h,ODSocket.cpp到工程目录即可。

顺便提一下通用的BSD Socket: :

//创建一个socket连接

int socket (int family, int type, int protocol);

//连接目标主机

int connect(int s, const struct sockaddr *name, int namelen);

//关闭socket连接

int close(int fildes);

//发送内容

ssize_t send(int s, const void *msg, size_t len, int flags);

//接收内容

ssize_t recv(int s, void *buf, size_t len, int flags);

udp部分,使用通用的socket :

#ifdef WIN32

#include typedef intsocklen_t;

#endif

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)//android 平台,注意包含"cocos2d.h"

#include #define LOGI(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#define LOG_TAG "JWYGC_Thread"

#include #include #include #include #include #include #include #include #include typedef intSOCKET;

2. WIN32平台注意事项

1) 在链接器加入附加依赖项pthreadVCE2.lib.

2) 用以下代码对网络进行初始化,退出时进行清除.

//初始化, 放在网络使用之前

WSADATA wsaData;

WSAStartup(MAKEWORD(2, 0), &wsaData)

//清除网络使用, 放在网络使用完毕之后.

WSACleanup()

3) 线程使用需要初始化, 退出时进行清除.

//线程使用之前,初始化线程

pthread_win32_process_attach_np();

//线程使用之后,清除线程使用

pthread_win32_process_detach_np();

4) windows关闭连接使用closesocket,安卓和ios使用close.

#ifdef WIN32

closesocket(new_socket);

#else

close(new_socket); // android ,ios平台

#endif

5) 解析IP地址时,使用inet_addr, 详细如下:

const char *addr = "192.168.1.1";

struct in_addr ip = {0};

#ifdef WIN32

ip.s_addr = inet_addr(addr);

if(ip.s_addr == INADDR_NONE)

{

CCLOG("can't parse IP address %s", addr);

}

#else

if (!inet_aton(addr, &ip))

{

CCLOG("can't parse IP address %s", addr);

}

#endif

struct hostent *host;

host = gethostbyaddr((char *) &ip, 4, AF_INET);

6) 判断主机连接是否关闭, 在此模块中本人使用recv返回值来判断连接是否被主机关闭, Win32和其他平台迥异的是recv返回0为主机关闭连接, 而其他平台(ios, android)返回-1为主机关闭连接.

3. ios平台注意事项

1) 调试发现, ios平台sem_init总是返回-1, 网上求证得知可能由于ios不支持无名信号量导致, 使用以下方式用以代替sem_init.

//获取及初始化信号量

sem_t *my_sem;

my_sem = sem_open("/mysem1", O_CREAT,0664,0);

//使用sem_open方式创建的信号量在使用完毕需清除.

sem_unlink("/mysem1");

4. android平台注意事项

1)记得在AndroidManifest.xml中加上网络使用权限.

给出几个小函数:

1,获取本机IP:

bool UdpSocket::getLocalIP(char *szLocalIP)

{

#ifdefWIN32

char name[255];//定义用于存放获得的主机名的变量

struct hostent *hostinfo;

if( gethostname ( name, sizeof(name)) == 0) {

if((hostinfo = gethostbyname(name)) != NULL) {

strcpy(szLocalIP,inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list));

strcpy(m_szLocalIP,szLocalIP);

}

}

return true;

#else

int sock_get_ip;

struct sockaddr_in *sin;

struct ifreq ifr_ip;

if ((sock_get_ip=socket(AF_INET, SOCK_STREAM, 0)) == -1) {

CCLOG("get_ip error");

return false;

}

memset(&ifr_ip, 0, sizeof(ifr_ip));

strncpy(ifr_ip.ifr_name, "wlan0", sizeof(ifr_ip.ifr_name) - 1); //无线是wlan0,有线是eth0。可能还需要判断有线无线,比较麻烦。

if( ioctl( sock_get_ip, SIOCGIFADDR, &ifr_ip) < 0 ){

char errmsg[30];

sprintf(errmsg,"getip1:%d",errno);

CCLOG(errmsg);

return false;

}

sin = (struct sockaddr_in *)&ifr_ip.ifr_addr;

strcpy(szLocalIP,inet_ntoa(sin->sin_addr));

close( sock_get_ip );

strcpy(m_szLocalIP,szLocalIP);

return true;

#endif

}

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值