1. 程式人生 > >cocos2d-x 跨平臺Socket網路模組

cocos2d-x 跨平臺Socket網路模組

相信很多人都找,但網上給出的答案又覺得看不懂。其實就是使用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這個連結庫

這裡只是簡單的封裝,至於異常之類的,我沒有去實現,你們可以自己去實現。