c c++实现websocekt c c++ websocket库

该博客介绍了如何使用XEngine实现WebSocket服务器和客户端。通过提供的代码示例,展示了网络服务初始化、WebSocket握手处理、数据接收与发送以及线程处理。用户可以利用这些示例进行WebSocket应用程序或服务器的开发,并提供了在线测试网址进行连接验证。
摘要由CSDN通过智能技术生成

此程序基于XEngine实现.包含websocket 客户端和服务器例子

可以使用此代码方便的开发基于websocket的应用程序或者服务器

默认提供的是服务器.你可以通过一些websocket测试网站进行测试,比如,随便搜索百度一个测试网站http://coolaf.com/tool/chattest.然后填入你的ip地址加端口,比如我的是ws://192.168.1.2:5000/ 点击链接,提示成功,然后就可以发送数据了

提供的开发包包含网络服务和websocket库,你也可以自己实现网络相关程序,使用我们提供的websocket库

直接调用我们API非常方便,直接启动即可,下面将启动一个监听5000端口的websocket服务器

int main()
{
	WSADATA st_WSAData;
	WSAStartup(MAKEWORD(2, 2), &st_WSAData);

	memset(tszClientAddr, '\0', sizeof(tszClientAddr));

	if (!NetCore_TCPIocp_StartEx(&xhToken, 5000, 100, 2))
	{
		printf("%lX\n", NetCore_GetLastError());
		return 0;
	}
	NetCore_TCPIocp_RegisterCallBackEx(xhToken, NetCore_CB_Login, NetCore_CB_Recv, NetCore_CB_Close);
	RfcComponents_WSPacket_Init(10000, FALSE, 4);
	CreateThread(NULL, 0, NetCore_Thread, NULL, 0, NULL);
	while (1)
	{
		Sleep(1000);
	}
	WSACleanup();
	return 0;
}

启动后在接受数据的回调函数里面处理websocket数据,这里需要判断下blogin用户是否登录,因为websocket有一次握手操作,所以我们需要处理下握手操作,然后通过RfcComponents_WSPacket_Post 吧接受到的数据报投递到websocket库里面 让这个库来处理websocket的数据.

void __stdcall NetCore_CB_Recv(LPCSTR lpszClientAddr, SOCKET hSocket, LPCSTR lpszRecvMsg, int nMsgLen, LPVOID lParam)
{
	printf("NetCore_CB_Recv:%s-%d\n", lpszClientAddr, nMsgLen);
	BOOL bLogin = FALSE;
	RfcComponents_WSPacket_GetLogin(lpszClientAddr, &bLogin);
	if (bLogin)
	{
		if (!RfcComponents_WSPacket_Post(lpszClientAddr, lpszRecvMsg, nMsgLen))
		{
			printf("RfcComponents_WSPacket_Post:%lX\n", WSFrame_GetLastError());
		}
	}
	else
	{
		int nSDLen = nMsgLen;
		TCHAR tszHandsBuffer[1024];
		memset(tszHandsBuffer, '\0', sizeof(tszHandsBuffer));

		RfcComponents_WSConnector_HandShake(lpszRecvMsg, &nSDLen, tszHandsBuffer);
		NetCore_TCPIocp_SendEx(xhToken, lpszClientAddr, tszHandsBuffer, nSDLen);
		RfcComponents_WSPacket_SetLogin(lpszClientAddr);
	}
}

最后,我们只需要取出包即可.取出的包是一个完整的websocket数据包.我们启动一个线程来一直获取是否有可以处理的websocket数据,下面的代码,tszMsgBuffer 就是表明要处理的数据缓冲区,nMsgLen缓冲区大小

DWORD WINAPI NetCore_Thread(LPVOID lParam)
{
	while (TRUE)
	{
		if (RfcComponents_WSPacket_WaitEvent(1))
		{
			int nMsgLen = 20480;
			ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE enOPCode;
			TCHAR tszMsgBuffer[20480];
			memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer));

			list<RFCCOMPONENTS_WSPKT_CLIENT> stl_ListClient;
			RfcComponents_WSPacket_GetPool(1, &stl_ListClient);

			list<RFCCOMPONENTS_WSPKT_CLIENT>::const_iterator stl_ListIterator = stl_ListClient.begin();
			for (;stl_ListIterator != stl_ListClient.end();stl_ListIterator++)
			{
				for (int i = 0;i < stl_ListIterator->nPktCount;i++)
				{
					if (RfcComponents_WSPacket_Get(stl_ListIterator->tszClientAddr, tszMsgBuffer, &nMsgLen, &enOPCode))
					{
						printf("%s %d:%s\n", stl_ListIterator->tszClientAddr, nMsgLen, tszMsgBuffer);
					}
				}
			}
		}
		Sleep(1);
	}
	return 0;
}

当然,你也可以给这个客户端发送数据,RfcComponents_WSCodec_EncodeMsg 这个函数用于编码要发送的数据,用这个函数来把数据编码成websocket格式

if (RfcComponents_WSCodec_EncodeMsg("123456", tszMsgBuffer, &nRVLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_TEXT))
		{
			if (NetCore_TCPIocp_SendEx(xhToken, lpszClientAddr(ip:port),tszMsgBuffer, nRVLen))
			{
				printf("NetClient_TCPSelect_SendMsg:%d\n", nRVLen);
			}
		}

这里提供了一份完整的代码包,你可以直接下载测试:https://download.csdn.net/download/aaadddzxc/15203652

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xengine-qyt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值