📄 serversockmsg.cpp
字号:
#include "stdafx.h"
extern HWND g_hStatusBar;
extern SOCKET g_ssock;
extern SOCKET g_csock;
extern HANDLE g_hIOCP;
CWHDynamicArray<CSessionInfo> g_UserInfoArray;
CWHQueue g_SendToServerQ;
void UpdateStatusBar(BOOL fGrow)
{
static long nNumOfCurrSession = 0;
TCHAR szText[20];
(fGrow ? InterlockedIncrement(&nNumOfCurrSession) : InterlockedDecrement(&nNumOfCurrSession));
wsprintf(szText, _TEXT("%d Sessions"), nNumOfCurrSession);
SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(3, 0), (LPARAM)szText);
}
void SendSocketMsgS (_LPTMSGHEADER lpMsg, int nLen1, char *pszData1, int nLen2, char *pszData2)
{
char szBuf[1024];
WSABUF Buf;
DWORD dwSendBytes;
memmove(szBuf, lpMsg, sizeof(_TMSGHEADER));
if (pszData1)
memmove(&szBuf[sizeof(_TMSGHEADER)], pszData1, nLen1);
if (pszData2)
memmove(&szBuf[sizeof(_TMSGHEADER) + nLen1], pszData2, nLen2);
szBuf[sizeof(_TMSGHEADER) + nLen1 + nLen2] = '\0';
Buf.len = sizeof(_TMSGHEADER) + nLen1 + nLen2;
Buf.buf = szBuf;
WSASend(g_csock, &Buf, 1, &dwSendBytes, 0, NULL, NULL);
// send(g_csock, szBuf, sizeof(_TMSGHEADER) + nLen1 + nLen2, 0);
//#ifdef _DEBUG
// _RPT4(_CRT_WARN, "SS:%d %d %d %d\t", lpMsg->wUserGateIndex, lpMsg->wIdent, lpMsg->wUserListIndex, lpMsg->nLength);
// _RPT1(_CRT_WARN, "%s\n", szBuf);
//#endif
}
void SendSocketMsgS (int nIdent, WORD wIndex, int nSocket, WORD wSrvIndex, int nLen, char *pszData)
{
_TMSGHEADER msg;
char szBuf[1024];
WSABUF Buf;
DWORD dwSendBytes;
msg.nCode = 0xAA55AA55;
msg.nSocket = nSocket;
msg.wUserGateIndex = wIndex;
msg.wIdent = (WORD)nIdent;
msg.wUserListIndex = wSrvIndex;
msg.nLength = nLen;
memmove(szBuf, &msg, sizeof(_TMSGHEADER));
if (pszData)
memmove(&szBuf[sizeof(_TMSGHEADER)], pszData, nLen);
szBuf[sizeof(_TMSGHEADER) + nLen] = '\0';
Buf.len = sizeof(_TMSGHEADER) + nLen;
Buf.buf = szBuf;
WSASend(g_csock, &Buf, 1, &dwSendBytes, 0, NULL, NULL);
// send(g_csock, szBuf, sizeof(_TMSGHEADER) + nLen, 0);
//#ifdef _DEBUG
// _RPT4(_CRT_WARN, "SS:%d %d %d %d \t", msg.wUserGateIndex, msg.wIdent, msg.wUserListIndex, msg.nLength);
// _RPT1(_CRT_WARN, "%s\n", szBuf);
//#endif
}
//UINT WINAPI AcceptThread(LPVOID lpParameter)
DWORD WINAPI AcceptThread(LPVOID lpParameter)
{
int nLen = sizeof(SOCKADDR_IN);
char szMsg[64];
TCHAR szAddress[24];
int nCvtLen;
SOCKET Accept;
SOCKADDR_IN Address;
// DWORD dwRecvBytes;
// DWORD dwFlags;
while (TRUE)
{
Accept = accept(g_ssock, (struct sockaddr FAR *)&Address, &nLen);
if (g_fTerminated)
return 0;
int nIndex = g_UserInfoArray.GetAvailablePosition();
if (nIndex >= 0)
{
CSessionInfo* pNewSessionInfo = g_UserInfoArray.GetEmptyElement(nIndex);
pNewSessionInfo->sock = Accept;
pNewSessionInfo->nGateIndex = nIndex;
// Initializing Session Information
pNewSessionInfo->nCrackWarningLevel = 0;
pNewSessionInfo->fLoginCode = TRUE;
pNewSessionInfo->nSendBufferLen = 0;
CreateIoCompletionPort((HANDLE)Accept, g_hIOCP, (DWORD)pNewSessionInfo, 0);
pNewSessionInfo->Recv();
UpdateStatusBar(TRUE);
// Make packet and send to login server.
wsprintf(szAddress, _TEXT("%d.%d.%d.%d"), Address.sin_addr.s_net, Address.sin_addr.s_host,
Address.sin_addr.s_lh, Address.sin_addr.s_impno);
nCvtLen = WideCharToMultiByte(CP_ACP, 0, szAddress, -1, szMsg, sizeof(szMsg), NULL, NULL);
SendSocketMsgS(GM_OPEN, pNewSessionInfo->nGateIndex, (int)pNewSessionInfo->sock, 0, nCvtLen + 1, szMsg);
}
}
return 0;
}
void CloseSession(CSessionInfo* pSessionInfo)
{
g_UserInfoArray.SetEmptyElement(pSessionInfo->nGateIndex, pSessionInfo);
closesocket(pSessionInfo->sock);
UpdateStatusBar(FALSE);
}
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
DWORD dwBytesTransferred;
// DWORD dwFlags;
// DWORD dwRecvBytes;
// DWORD dwSendBytes;
CSessionInfo* pSessionInfo;
LPOVERLAPPED lpOverlapped;
// char *pszFirst, *pszEnd;
// CHAR szBuff[DATA_BUFSIZE + 1];
// INT nBuffLen;
while (TRUE)
{
GetQueuedCompletionStatus((HANDLE)CompletionPortID, &dwBytesTransferred, (LPDWORD)&pSessionInfo,
(LPOVERLAPPED *)&lpOverlapped, INFINITE);
if (dwBytesTransferred == 0)
{
SendSocketMsgS(GM_CLOSE, pSessionInfo->nGateIndex, pSessionInfo->sock, pSessionInfo->nServerUserIndex, 0, NULL);
CloseSession(pSessionInfo);
continue;
}
if (pSessionInfo->nOvFlag == OVERLAPPED_RECV)
{
pSessionInfo->bufLen += dwBytesTransferred;
while ( pSessionInfo->HasCompletionPacket() )
{
_LPTSENDBUFF pSendData = new _TSENDBUFF;
if ( !pSendData )
break;
pSendData->sock = pSessionInfo->sock;
pSendData->nGateIndex = pSessionInfo->nGateIndex;
*(pSessionInfo->ExtractPacket( pSendData->szData )) = '\0';
g_SendToServerQ.Lock();
if ( !g_SendToServerQ.PushQ( (BYTE *) pSendData ) )
{
InsertLogMsg( _TEXT("PushQ() failed") );
delete pSendData;
}
g_SendToServerQ.Unlock();
}
if ( pSessionInfo->Recv() == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING )
{
InsertLogMsg(_TEXT("WSARecv() failed"));
CloseSession(pSessionInfo);
continue;
}
}
}
return 0L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -