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这个链接库


这里只是简单的封装,至于异常之类的,我没有去实现,你们可以自己去实现。


原创粉丝点击