@@ -45,6 +45,48 @@ void __stdcall MessageQueue_Callback_HttpLeave(LPCTSTR lpszClientAddr, SOCKET hS
4545 XEngine_MQXService_Close (lpszClientAddr, XENGINE_MQAPP_NETTYPE_HTTP , FALSE );
4646}
4747// ////////////////////////////////////////////////////////////////////////
48+ BOOL __stdcall MessageQueue_Callback_WSLogin (LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
49+ {
50+ SessionModule_Client_Create (lpszClientAddr);
51+ SocketOpt_HeartBeat_InsertAddrEx (xhWSHeart, lpszClientAddr);
52+ RfcComponents_WSPacket_Create (lpszClientAddr, 0 );
53+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO , _T (" Websocket客户端连接,Websocket客户端地址:%s" ), lpszClientAddr);
54+ return TRUE ;
55+ }
56+ void __stdcall MessageQueue_Callback_WSRecv (LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam)
57+ {
58+ BOOL bLogin = FALSE ;
59+ RfcComponents_WSPacket_GetLogin (lpszClientAddr, &bLogin);
60+ if (bLogin)
61+ {
62+ if (!RfcComponents_WSPacket_Post (lpszClientAddr, lpszRecvMsg, nMsgLen))
63+ {
64+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR , _T (" 投递Websocket数据包到消息队列失败,错误:%lX" ), WSFrame_GetLastError ());
65+ return ;
66+ }
67+ SocketOpt_HeartBeat_ActiveAddrEx (xhWSHeart, lpszClientAddr);
68+ }
69+ else
70+ {
71+ int nSDLen = nMsgLen;
72+ TCHAR tszHandsBuffer[1024 ];
73+ memset (tszHandsBuffer, ' \0 ' , sizeof (tszHandsBuffer));
74+
75+ RfcComponents_WSConnector_HandShake (lpszRecvMsg, &nSDLen, tszHandsBuffer);
76+ RfcComponents_WSPacket_SetLogin (lpszClientAddr);
77+ NetCore_TCPXCore_SendEx (xhWSSocket, lpszClientAddr, tszHandsBuffer, nSDLen);
78+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO , _T (" WEBSOCKET客户端:%s 与服务器握手成功" ), lpszClientAddr);
79+ }
80+ }
81+ void __stdcall MessageQueue_Callback_WSLeave (LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
82+ {
83+ XEngine_MQXService_Close (lpszClientAddr, XENGINE_MQAPP_NETTYPE_WEBSOCKET , FALSE );
84+ }
85+ void __stdcall MessageQueue_Callback_WSHeart (LPCSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam)
86+ {
87+ XEngine_MQXService_Close (lpszClientAddr, XENGINE_MQAPP_NETTYPE_WEBSOCKET , TRUE );
88+ }
89+ // ////////////////////////////////////////////////////////////////////////
4890void XEngine_MQXService_Close (LPCTSTR lpszClientAddr, int nIPProto, BOOL bHeart)
4991{
5092 if (XENGINE_MQAPP_NETTYPE_TCP == nIPProto)
@@ -62,6 +104,21 @@ void XEngine_MQXService_Close(LPCTSTR lpszClientAddr, int nIPProto, BOOL bHeart)
62104 }
63105 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO , _T (" TCP客户端离开,TCP客户端地址:%s" ), lpszClientAddr);
64106 }
107+ else if (XENGINE_MQAPP_NETTYPE_WEBSOCKET == nIPProto)
108+ {
109+ RfcComponents_WSPacket_Delete (lpszClientAddr);
110+ SessionModule_Client_Delete (lpszClientAddr);
111+
112+ if (bHeart)
113+ {
114+ NetCore_TCPXCore_CloseForClientEx (xhWSSocket, lpszClientAddr);
115+ }
116+ else
117+ {
118+ SocketOpt_HeartBeat_DeleteAddrEx (xhWSHeart, lpszClientAddr);
119+ }
120+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO , _T (" Websocket客户端离开,Websocket客户端地址:%s" ), lpszClientAddr);
121+ }
65122 else
66123 {
67124 RfcComponents_HttpServer_CloseClinetEx (xhHTTPPacket, lpszClientAddr);
@@ -100,5 +157,18 @@ BOOL XEngine_MQXService_Send(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int
100157 return FALSE ;
101158 }
102159 }
160+ else if (XENGINE_MQAPP_NETTYPE_WEBSOCKET == nIPProto)
161+ {
162+ TCHAR tszPKTBuffer[8196 ];
163+ memset (tszPKTBuffer, ' \0 ' , sizeof (tszPKTBuffer));
164+
165+ RfcComponents_WSCodec_EncodeMsg (lpszMsgBuffer, tszPKTBuffer, &nMsgLen, ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE_TEXT );
166+ if (!NetCore_TCPXCore_SendEx (xhWSSocket, lpszClientAddr, tszPKTBuffer, nMsgLen))
167+ {
168+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR , _T (" 发送数据给Websocket客户端:%s,失败,错误:%lX" ), lpszClientAddr, NetCore_GetLastError ());
169+ return FALSE ;
170+ }
171+ SocketOpt_HeartBeat_ActiveAddrEx (xhWSHeart, lpszClientAddr);
172+ }
103173 return TRUE ;
104174}
0 commit comments