cocos2dx3.x利用sokcet建立客戶端和服務端(一)
阿新 • • 發佈:2019-02-17
Socke基類:
包括Socket的初始化,主要是windows上,在android上就不需要了
如果平臺為windows,則需要初始化
SocketBase::SocketBase() { _bInitSuccess = false; #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) WORD wVersionRequested; wVersionRequested = MAKEWORD(2, 0); WSADATA wsaData; int nRet = WSAStartup(wVersionRequested, &wsaData); if (nRet != 0) { fprintf(stderr, "Initilize Error!\n"); return; } _bInitSuccess = true; #endif }
當然析構時也要釋放資源
SocketBase::~SocketBase()
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
if (_bInitSuccess)
{
WSACleanup();
}
#endif
}
因為windows的socket()返回的socket控制代碼為SOCKET(UINT_PTR)
與android的socket()返回的socket控制代碼int, 型別不一樣,所以都定義為HSocket
對於服務端和客戶端都有關閉連線,所以基類就實現共同的。
void SocketBase::closeConnect(HSocket socket) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) close(socket); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) closesocket(socket); #endif }
當執行socket()出錯時,windows返回SOCKET_ERROR, android 返回<0,
所以實現error()
bool SocketBase::error(HSocket socket)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
return socket == SOCKET_ERROR;
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
return socket < 0;
#endif
}
SocketBase.h
#ifndef __SOCKET_BASE_H__ #define __SOCKET_BASE_H__ #include "cocos2d.h" #include <list> #include <thread> USING_NS_CC; // 對於windows平臺 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #include <WinSock2.h> #pragma comment(lib, "WS2_32.lib") #define HSocket SOCKET // 對於android平臺 #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <arpa/inet.h> // for inet_** #include <netdb.h> // for gethost** #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include <sys/socket.h> // for socket #include <unistd.h> #include <stdio.h> // for printf #include <stdlib.h> // for exit #include <string.h> // for bzero #define HSocket int #endif class SocketBase : public Ref { public: SocketBase(); ~SocketBase(); protected: void closeConnect(HSocket socket); bool error(HSocket socket); protected: std::mutex _mutex; private: bool _bInitSuccess; }; #endif