服务端:
初始化服务端
向指定客户端发送消息
voID@H_403_15@sendMessage(HSocket@H_403_15@socket,const@H_403_15@char@H_403_15@*data,255); Font-size:9.5pt; Font-family:新宋体">int@H_403_15@count);@H_403_15@
向所有客户端发送消息
voID sendMessage(const char* data,int count);
当服务端开启后的回调函数
std::function<voID(constchar*ip)>onStart;
当有新连接时的回调函数
std::voID(HSocketsocket)>onNewConnection;
当有消息时的回调函数
@H_403_15@std::function@H_403_15@<voID@H_403_15@(int@H_403_15@count)>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!"); } }}总结
以上是内存溢出为你收集整理的cocos2dx3.x利用sokcet创建客户端和服务端 (二)全部内容,希望文章能够帮你解决cocos2dx3.x利用sokcet创建客户端和服务端 (二)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)