cocos2dx Socket (一)

来源:互联网 发布:js字符串contains 编辑:程序博客网 时间:2024/06/06 06:47

socket类

#ifndef __CLIENT_SOCKET__H__#define __CLIENT_SOCKET__H__#ifdef WIN32#include <winsock.h>#else#include <sys/socket.h>#include <sys/errno.h>#include <fcntl.h>#include <arpa/inet.h>#include <netinet/in.h>#include <netdb.h>#endifenum{EVENT_CONNECT_ERROR = -10,/*buf = NULL len = 0*/EVENT_READ_ERROR,EVENT_ERROR = -1,/*buf = NULL len = 0*/EVENT_PROGRESS = 0,/*socket阻塞状态*/EVENT_CONNECTED,/*buf = NULL len = 0*/EVENT_READ,/*buf = 收到数据类型 len = 收到数据长度*/};//event: 消息类型//buf: 数据//len: 长度 typedef void (*MY_SOCKET_CALLBACK)(int event,void* buf,int len);/*当我们以非阻塞的方式来进行连接的时候,返回的结果如果是 -1,这并不代表这次连接发生了错误,如果它的返回结果是 EINPROGRESS,那么就代表连接还在进行中。 后面可以通过poll或者select来判断socket是否可写,如果可以写,说明连接完成了。*/class CMySocket{public:CMySocket( char* ip, int port );~CMySocket();public:int MyCreateSocket(void);//创建socket并设置为非阻塞int MyConnect(void);int MyRecv( void* buf, int len );int MySend( void* buf, int len );int MyClose(void);void MySetSocketCallBack(MY_SOCKET_CALLBACK cb);int MyGetSockFd(void){return m_sock_fd;}MY_SOCKET_CALLBACK MyGetSocketCallBack(void){return m_callback;}static char* InetNtoa(unsigned int  ip);static char*  DnsToIp(char *dns);#ifdef WIN32static void WinSocketStart(void);static void WinSocketClean(void);static bool isWinSocketStart;static int socketNum;#endifprivate://socket句柄int m_sock_fd;char m_ip[24];int m_port;MY_SOCKET_CALLBACK m_callback;};#endif


#include "ClientSocket.h"#include  <iostream>using namespace std;#ifdef WIN32#pragma comment(lib, "wsock32")#endifstatic char socketIP[30];#ifdef WIN32bool CMySocket::isWinSocketStart = false;int CMySocket::socketNum = 0;void CMySocket::WinSocketStart(void){socketNum ++;if(isWinSocketStart == false){WSADATA wsaData;//#define MAKEWORD(a,b) ((WORD) (((BYTE) (a)) | ((WORD) ((BYTE) (b))) << 8)) WORD version = MAKEWORD(2, 0);int ret = WSAStartup(version, &wsaData);//win sock start upisWinSocketStart = true;}}void CMySocket::WinSocketClean(void){if(isWinSocketStart == true){if(socketNum == 1){WSACleanup();isWinSocketStart = false;}}socketNum -- ;}#endifchar* CMySocket::InetNtoa(unsigned int  ip){struct in_addr addr1;memcpy(&addr1, &ip, 4 );char *tem = inet_ntoa(addr1);strcpy_s(socketIP, tem);return socketIP;}char*  CMySocket::DnsToIp(char *dns){#ifdef WIN32WinSocketStart();#endifstruct hostent *host;host=gethostbyname(dns);char *tem = inet_ntoa(*(struct in_addr*)(host->h_addr));strcpy_s(socketIP, tem);return socketIP;}CMySocket::CMySocket( char* ip, int port ){#ifdef WIN32WinSocketStart();#endifm_port = port;strcpy_s( m_ip, ip );m_sock_fd = -1;m_callback = NULL;}CMySocket::~CMySocket(){this->MyClose();#ifdef WIN32WinSocketClean();#endif}int CMySocket::MyCreateSocket(void){int flags, s;int sock_fd = socket( AF_INET, SOCK_STREAM, 0 );//在进行网络连接前,需要用socket函数向系统申请一个通信端口if( sock_fd < 0 ){return -1;}#ifdef WIN32#else//Set non-blockflags = fcntl (sock_fd, F_GETFL, 0);//get sock fd flagsif (flags == -1){close(sock_fd);return -1;}flags |= O_NONBLOCK;//set fd's flag to non-blocks = fcntl (sock_fd, F_SETFL, flags);if (s == -1){close(sock_fd);return -1;}#endifm_sock_fd = sock_fd;return m_sock_fd;}int CMySocket::MyConnect(void){int ret;struct sockaddr_in clientAddr;memset(&clientAddr, 0, sizeof(clientAddr));//置字节字符串s的前n个字节为零且包括‘\0’。clientAddr.sin_family = AF_INET;//一般来说 AF_INET(地址族)PF_INET(协议族 )clientAddr.sin_port = htons(m_port);//必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字clientAddr.sin_addr.s_addr = inet_addr(m_ip);//ip地址ret = connect(m_sock_fd, (sockaddr*)&clientAddr, sizeof(sockaddr_in));//建立与一个端的连接 若无错误发生 连接成功返回0#ifdef WIN32#elseif( ret == -1 ){if( errno == EINPROGRESS ){return EVENT_PROGRESS;}}#endifreturn ret;}int CMySocket::MyRecv( void* buf, int len ){return recv( m_sock_fd, (char *)buf, len, 0 );}int CMySocket::MySend( void* buf, int len ){return send( m_sock_fd, (char *)buf, len, 0 );}int CMySocket::MyClose(void){if( m_sock_fd >= 0 ){#ifdef WIN32closesocket(m_sock_fd);#elseclose( m_sock_fd );#endifm_sock_fd = -1;}return 0;} void CMySocket::MySetSocketCallBack(MY_SOCKET_CALLBACK cb){m_callback = cb;}



0 0
原创粉丝点击