相信很多人都找,但网上给出的答案又觉得看不懂。其实就是使用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这个链接库
这里只是简单的封装,至于异常之类的,我没有去实现,你们可以自己去实现。