client使用的socket.
注意:連結時是阻塞模式,連結後轉為了非阻塞.不必多線程.自己簡單封裝了一下提供給一些不熟悉的人看看.
linux下使用的無訊號調用,IOS下忽略了SIG_IGN訊號。這樣做避免掉線進程被關閉.
收發訊息時 LHS_EAGAIN 與 LHS_EWOULDBLOCK 錯誤碼可以不做處理,因為本socket為非阻塞.
SOCKET_CONNECTION_ERROR 為自訂錯誤碼.
如需轉載請連結原始地址.
LHSSocket.h檔案代碼如下
#ifndef __LHSSOCKET_H__#define __LHSSOCKET_H__#include "cocos2d.h"#define SOCKET_CONNECTION_ERROR(-917)#if (CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)#include <WinSock.h>#pragma comment (lib,"WSock32.Lib")//#include <WinSock2.h>//#pragma comment (lib,"WS2_32.Lib")#else#include <signal.h>#include <sys/socket.h>#include <netinet/in.h>#include<netinet/tcp.h>#include <netdb.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <arpa/inet.h>typedef intSOCKET;#define INVALID_SOCKET(SOCKET)(~0)#define SOCKET_ERROR(-1)#endif//error#if (CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)#define LHS_EAGAINWSAEWOULDBLOCK#define LHS_EWOULDBLOCKWSAEWOULDBLOCK#else#define LHS_EAGAINEAGAIN//此操作會令線程阻塞,但socket為不可阻塞的#define LHS_EWOULDBLOCKEWOULDBLOCK//資源暫時不可用#endif/***************************TCP IP ClientSocket NONBLOCK ***************************/class LHSSocket{public:LHSSocket();~LHSSocket();//初始化通訊端環境int initSocket();//關閉通訊端環境int clearSocket();//串連int Connect(const char* ip, unsigned short port);//重串連int ReConnect(const char* ip, unsigned short port);//中斷連線void disconnect();//發送int Send(const char* buf, int len);//擷取int Recv(char* buf, int len);//獲得錯誤碼int getError();protected:SOCKET m_Socket;bool m_isConnect;};#endif//__LHSSOCKET_H__
LHSSocket.cpp檔案代碼如下
#include "LHSSocket.h"using namespace cocos2d;static bool isSetSig=true;LHSSocket::LHSSocket():m_Socket(INVALID_SOCKET),m_isConnect(false){#if (CC_TARGET_PLATFORM==CC_PLATFORM_IOS)if (isSetSig){isSetSig=false;struct sigaction Sa;Sa.sa_handler = SIG_IGN;sigaction(SIGPIPE,&Sa,0);}#endif}LHSSocket::~LHSSocket(){}int LHSSocket::initSocket(){int ret=0;#if (CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD(1,1);ret=WSAStartup( wVersionRequested, &wsaData );#endifif (m_Socket!=INVALID_SOCKET){CCLog("Disconnect socket in <initSocket>!");this->disconnect();}m_Socket=socket(AF_INET,SOCK_STREAM,0);if (m_Socket==INVALID_SOCKET){CCLog("socket socket error!");ret=SOCKET_ERROR;}return ret;}int LHSSocket::clearSocket(){m_isConnect=false;this->disconnect();#if (CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)return WSACleanup();#elsereturn 0;#endif}int LHSSocket::getError(){#if (CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)return (WSAGetLastError());#elsereturn (errno);#endif}int LHSSocket::Connect(const char* ip, unsigned short port){int ret=SOCKET_ERROR;do {hostent* hp=gethostbyname(ip);if (!hp){CCLog("socket gethostbyname error!");break;}sockaddr_in svraddr;memset(&svraddr, 0, sizeof(svraddr));memcpy((char*)&svraddr.sin_addr, hp->h_addr, hp->h_length);svraddr.sin_family = hp->h_addrtype;svraddr.sin_port = htons(port);CCLog("socket connect ip=%s,port=%d",ip,port);ret=connect(m_Socket,(sockaddr*)&svraddr,sizeof(svraddr));if (ret!=SOCKET_ERROR){m_isConnect=true;#if (CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)u_long ul=1;ioctlsocket(m_Socket,FIONBIO,&ul);#elsefcntl(m_Socket, F_SETFL, O_NONBLOCK);#endif}} while (0);return ret;}int LHSSocket::ReConnect(const char* ip, unsigned short port){this->disconnect();this->initSocket();return this->Connect(ip,port);}void LHSSocket::disconnect(){if (m_Socket!=INVALID_SOCKET){m_isConnect=false;#if (CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)closesocket(m_Socket);#elseclose(m_Socket);#endifm_Socket=INVALID_SOCKET;CCLog("socket disconnect");}}int LHSSocket::Send(const char* buf, int len){if (m_Socket==INVALID_SOCKET || !m_isConnect){return SOCKET_CONNECTION_ERROR;}unsigned int flags=0;#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)flags=MSG_NOSIGNAL;#endifreturn send(m_Socket, buf, len, flags);}int LHSSocket::Recv(char* buf, int len){if (m_Socket==INVALID_SOCKET || !m_isConnect){return SOCKET_CONNECTION_ERROR;}unsigned int flags=0;#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)flags=MSG_NOSIGNAL;#endifreturn recv(m_Socket, buf, len, flags);}
轉帖:http://blog.csdn.net/laik228/article/details/8937022