cocos2dx3.x利用sokcet创建客户端和服务端 (二)

cocos2dx3.x利用sokcet创建客户端和服务端 (二),第1张

概述服务端: 初始化服务端 向指定客户端发送消息 void sendMessage(HSocket socket, const char* data, int count); 向所有客户端发送消息 void sendMessage(const char* data, int count); 当服务端开启后的回调函数 std::function<void(const char* ip)> onStart

服务端:

初始化服务端

向指定客户端发送消息

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创建客户端和服务端 (二)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1023680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存