现在的位置: 首页 > 综合 > 正文

cocos2d-x 跨平台Socket网络模块

2014年01月02日 ⁄ 综合 ⁄ 共 2249字 ⁄ 字号 评论关闭

相信很多人都找,但网上给出的答案又觉得看不懂。其实就是使用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这个链接库

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

抱歉!评论已关闭.