cocos2d-x 跨平臺Socket網路模組
阿新 • • 發佈:2019-01-05
相信很多人都找,但網上給出的答案又覺得看不懂。其實就是使用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這個連結庫
這裡只是簡單的封裝,至於異常之類的,我沒有去實現,你們可以自己去實現。