intcount);" />
大佬教程收集整理的这篇文章主要介绍了cocos2dx3.x利用sokcet创建客户端和服务端 (二),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
voidsendmessage(HSocketsocket,constchar*data,255); font-size:9.5pt; font-family:新宋体">intcount);
@H_607_0@向所有客户端发送消息 @H_607_0@void sendmessage(const char* data,int count); @H_607_0@当服务端开启后的回调函数 @H_607_0@std::function<void(constchar*ip)>onStart; @H_607_0@当有新连接时的回调函数 @H_607_0@std::void(HSocketsocket)>onNewConnection; @H_607_0@当有消息时的回调函数std::function<void(intcount)>onRecv;
@H_607_0@当有客户端断开连接时的回调函数 @H_607_0@std::HSocketsocket)>onDisconnect; @H_607_0@SocketServer.h#ifndef __SOCKET_SERVER_H__ #define __SOCKET_SERVER_H__ #include "SocketBase.h" class SocketServer : public SocketBase { public: static SocketServer* create(); SocketServer(); ~SocketServer(); bool startServer(); void sendmessage(HSocket socket,const char* data,int count); void sendmessage(const char* data,int count); std::function<void(const char* ip)> onStart; std::function<void(HSocket socket)> onNewConnection; std::function<void(const char* data,int count)> onRecv; std::function<void(HSocket socket)> onDisconnect; private: bool initServer(); void acceptClient(); void acceptFunc(); void newClientConnected(HSocket socket); void recvmessage(HSocket socket); private: HSocket _socketServer; private: std::list<HSocket> _clientSockets; }; #endif
#include "SocketServer.h" SocketServer* SocketServer::create() { auto server = new SocketServer; return server; } SocketServer::SocketServer() : _socketServer(0),onRecv(nullptr),onStart(nullptr),onNewConnection(nullptr) { } SocketServer::~SocketServer() { _clientSockets.clear(); if (_socketServer) { this->closeConnect(_socketServer); } }; bool SocketServer::startServer() { if (!initServer()) { return false; } return true; } bool SocketServer::initServer() { if (_socketServer != 0) { this->closeConnect(_socketServer); } _socketServer = socket(AF_INET,SOCK_STREAM,0); if (error(_socketServer)) { log("socket error!"); _socketServer = 0; return false; } do { struct sockaddr_in sockAddr; memset(&sockAddr,sizeof(sockAddr)); sockAddr.sin_family = AF_INET; sockAddr.sin_port = htons(8000); sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); int ret = 0; ret = bind(_socketServer,(const sockaddr*)&sockAddr,sizeof(sockAddr)); if (ret < 0) { log("bind error!"); break; } ret = listen(_socketServer,5); if (ret < 0) { log("listen error!"); break; } // start char hostName[256]; gethostname(hostName,sizeof(hostName)); struct hostent* hosTinfo = gethostbyname(hostName); char* ip = inet_ntoa(*(struct in_addr *)*hosTinfo->h_addr_list); this->acceptClient(); if (onStart != nullptr) { log("start server!"); onStart(ip); } return true; } while (false); this->closeConnect(_socketServer); _socketServer = 0; return false; } void SocketServer::acceptClient() { std::thread th(&SocketServer::acceptFunc,this); th.detach(); } void SocketServer::acceptFunc() { int len = sizeof(sockaddr); struct sockaddr_in sockAddr; while (true) { HSocket clientSock = accept(_socketServer,(sockaddr*)&sockAddr,&len); if (error(clientSock)) { log("accept error!"); break; } this->newClientConnected(clientSock); } } void SocketServer::newClientConnected(HSocket socket) { log("new connect!"); _clientSockets.push_BACk(socket); std::thread th(&SocketServer::recvmessage,this,socket); th.detach(); if (onNewConnection != nullptr) { onNewConnection(socket); } } void SocketServer::recvmessage(HSocket socket) { char buff[1024]; int ret = 0; while (true) { ret = recv(socket,buff,sizeof(buff),0); if (ret < 0) { log("recv(%d) error!",socket); _mutex.lock(); this->closeConnect(socket); _clientSockets.remove(socket); if (onDisconnect != nullptr) { onDisconnect(socket); } _mutex.unlock(); break; } else { buff[ret] = 0; log("recv msg : %s",buff); if (ret > 0 && onRecv != nullptr) { onRecv(buff,ret); } } } } void SocketServer::sendmessage(HSocket socket,int count) { for (auto& sock : _clientSockets) { if (sock == socket) { int ret = send(socket,data,count,0); if (ret < 0) { log("send error!"); } break; } } } void SocketServer::sendmessage(const char* data,int count) { for (auto& socket : _clientSockets) { int ret = send(socket,0); if (ret < 0) { log("send error!"); } } }
以上是大佬教程为你收集整理的cocos2dx3.x利用sokcet创建客户端和服务端 (二)全部内容,希望文章能够帮你解决cocos2dx3.x利用sokcet创建客户端和服务端 (二)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。