cocos2dx3.x利用sokcet创建客户端和服务端 (二)
发布时间:2020-12-14 19:50:37 所属栏目:百科 来源:网络整理
导读:服务端 : 初始化服务端 向指定客户端发送消息 void sendMessage( HSocket socket, const char *data,255); font-size:9.5pt; font-family:新宋体">int count); 向所有客户端发送消息 void sendMessage(const char* data,int count); 当服务端开启后的回调函
服务端: 初始化服务端 向指定客户端发送消息
voidsendMessage(HSocketsocket,constchar*data,255); font-size:9.5pt; font-family:新宋体">intcount); 向所有客户端发送消息 void sendMessage(const char* data,int count); 当服务端开启后的回调函数 std::function<void(constchar*ip)>onStart; 当有新连接时的回调函数 std::void(HSocketsocket)>onNewConnection; 当有消息时的回调函数 std::function<void(intcount)>onRecv; 当有客户端断开连接时的回调函数 std::HSocketsocket)>onDisconnect; 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
SocketServer.cpp #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!"); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |