cocos2d-x 跨平台Socket网络模块
来源:互联网 发布:园林设计软件图库 编辑:程序博客网 时间:2024/06/05 22:45
相信很多人都找,但网上给出的答案又觉得看不懂。其实就是使用bsd socket.但这个只能在linux下面使用,而在window是无法使用的。所以我们要封装一下。
#ifndef __CSocket__#define __CSocket__ #if CC_TARGET_PLATFORM==CC_PLATFORM_WIN32#include <winsock.h>#elif CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#elif CC_TARGET_PLATFORM==CC_PLATFORM_IOS#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#endif #include <string> using namespace std; class CSocket{ public: CSocket(); ~CSocket(); bool connect(const char* _adr,int _port); int read(char *buf,int size); int write(char *buf,int size); bool close(); private: string m_szAddress; int m_nPort; #if CC_TARGET_PLATFORM==CC_PLATFORM_WIN32 SOCKET handlerSocket; //这两个函数只有在windows下面才用 //初始化网络模块,一定不能忘,在main函数里面调用一次就可以了。 void initSocket() { WORD wVersionRequested; WSADATA wsaData; int ret; //WinSock初始化 wVersionRequested = MAKEWORD(1, 1); //希望使用的WinSock DLL的版本 ret = WSAStartup(wVersionRequested, &wsaData); if(ret!=0) { printf("WSAStartup() failed!\n"); return; } //确认WinSock DLL支持版本2.2 if(LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); printf("Invalid WinSock version!\n"); return; } } //这个在游戏退出的时候调用就可以了 void uninitSocket() { WSACleanup(); }#else int handlerSocket;#endif}; #endif
#include "CSocket.h" CSocket::CSocket(){} CSocket::~CSocket(){} bool CSocket::connect(const char *adr, int port){ this->m_szAddress = adr; this->m_nPort = port; sockaddr_in sa; struct hostent *hp; hp = gethostbyname(m_szAddress.c_str()); if (hp) { const char *addr = inet_ntoa(*(struct in_addr *)hp->h_addr_list[0]); struct in_addr ip; ip.s_addr = inet_addr(addr); sa.sin_family = AF_INET; sa.sin_port = htons(m_nPort); sa.sin_addr = ip; } if (sa.sin_port == 0) { return false; } int rs = 0; handlerSocket = socket(AF_INET, SOCK_STREAM, 0); rs =::connect(handlerSocket, (sockaddr *)&sa, sizeof(sa)); return rs > -1;} int CSocket::read(char *buf, int bufLength){ int readInt = recv(handlerSocket, buf, bufLength, 0); return readInt;} int CSocket::write(char *buf, int bufLength){ int writeInt = send(handlerSocket, buf, bufLength, 0); return writeInt;} bool CSocket::close(){ int closeInt = 0;#if defined(WIN32) closeInt =::shutdown(handlerSocket, 2);#else closeInt =::shutdown(handlerSocket, SHUT_RDWR);#endif if( closeInt > 0 ) { return true; } return false;}
这里我就不注释了,也没什么技术含量。
在xcode和ndk,windows下面编译通过,并且能正常使用。
VS 开发的时候记得要加上Ws2_32.lib这个链接库
这里只是简单的封装,至于异常之类的,我没有去实现,你们可以自己去实现。
- cocos2d-x 跨平台Socket网络模块
- Cocos2d-x基于BSD Socket网络通讯模块
- cocos2d-x 基于BSD Socket网络通讯模块
- cocos2d-x 基于BSD Socket网络通讯模块
- cocos2d-x 基于BSD Socket网络通讯模块
- cocos2d-x 跨平台搭建
- 【Cocos2d-x】cocos2d-x + socket
- cocos2d-x 基于BSD Socket收集通信模块小结
- cocos2d-x 基于BSD Socket网络通讯模块小结
- cocos2d-x 基于BSD Socket网络通讯模块小结
- Cocos2d-x网络篇03:Socket连接(1)
- cocos2d-x Socket [地瓜]
- cocos2d-x Socket
- [转]cocos2d-x Socket
- cocos2d-x,socket连接
- cocos2d-x socket
- Cocos2d-x数据模块
- Cocos2d-x跨平台开发文档总结
- make jsoncpp under Linux
- C++容器:顺序容器,关联容器
- 大话设计模式--外观模式 Facade -- C++实现实例
- POINT RECT CPoint CRect
- 深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 2
- cocos2d-x 跨平台Socket网络模块
- hdu 2896 病毒侵袭(AC自动机水题)
- jQuery利用JSONP解决AJAX跨域请求
- 小菜也开博客了 请各位多多指教哦!
- 解决myeclipse打开jsp页面慢的问题
- Http协议学习笔记二
- final
- pygame_camera
- [LeetCode]ZigZag Conversion