微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

服务端:

初始化服务端

向指定客户端发送消息

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!");
		}

	}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐