cocos2dx3.x利用sokcet创建客户端和服务端 (三)
发布时间:2020-12-14 19:50:51 所属栏目:百科 来源:网络整理
导读:客户端: 连接服务端 bool connectServer( const char *serverIP, unsigned short port); 向服务端发送消息 void sendMessage( char *data,255)">int count); 接受服务端数据的回调函数 std:: function void ( int count)onRecv; 断开连接的回调函数 std:: v
客户端: 连接服务端 boolconnectServer(constchar*serverIP,unsignedshortport); 向服务端发送消息 voidsendMessage(char*data,255)">intcount); 接受服务端数据的回调函数 std::function<void(intcount)>onRecv; 断开连接的回调函数 std::void()>onDisconnect; SocketClient.h #ifndef __SOCKET_CLIENT_H__ #define __SOCKET_CLIENT_H__ #include "SocketBase.h" class SocketClient : public SocketBase { public: SocketClient(void); ~SocketClient(void); bool connectServer(const char* serverIP,unsigned short port); void sendMessage(const char* data,int count); std::function<void(const char* data,int count)> onRecv; std::function<void()> onDisconnect; private: bool initClient(); void recvMessage(); private: HSocket _socketServer; HSocket _socektClient; }; #endif SocketClient.cpp #include "SocketClient.h" SocketClient::SocketClient(void) : onRecv(nullptr),_socektClient(0) { } SocketClient::~SocketClient(void) { if (_socektClient != 0) { _mutex.lock(); this->closeConnect(_socektClient); _mutex.unlock(); } } bool SocketClient::initClient() { if (_socektClient != 0) { _mutex.lock(); this->closeConnect(_socektClient); _mutex.unlock(); } _socektClient = socket(AF_INET,SOCK_STREAM,0); if (error(_socketServer)) { log("init client error!"); _socektClient = 0; return false; } return true; } bool SocketClient::connectServer(const char* serverIP,unsigned short port) { if (!this->initClient()) { return false; } struct sockaddr_in serverAddr; memset(&serverAddr,sizeof(struct sockaddr_in)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); serverAddr.sin_addr.s_addr = inet_addr(serverIP); int ret = 0; ret = connect(_socektClient,(struct sockaddr*)&serverAddr,sizeof(struct sockaddr)); if (ret < 0) { this->closeConnect(_socektClient); _socektClient = 0; return false; } std::thread recvThread(&SocketClient::recvMessage,this); recvThread.detach(); return true; } void SocketClient::recvMessage() { char recvBuf[1024]; int ret = 0; while (true) { ret = recv(_socektClient,recvBuf,sizeof(recvBuf),0); if (ret < 0) { log("recv error"); break; } if (ret > 0 && onRecv != nullptr) { onRecv(recvBuf,ret); } } _mutex.lock(); this->closeConnect(_socektClient); if (onDisconnect != nullptr) { onDisconnect(); } _socektClient = 0; _mutex.unlock(); } void SocketClient::sendMessage(const char* data,int count) { if (_socektClient != 0) { int ret = send(_socektClient,data,count,0); if (ret < 0) { log("send error!"); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |