www.pudn.com > LoginGate.rar > ClientSockMsg.cpp


#include "stdafx.h"

DWORD WINAPI ThreadFuncForMsg(LPVOID lpParameter);

BOOL CheckSocketError(LPARAM lParam);

VOID WINAPI OnTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);

void OnCommand(WPARAM wParam, LPARAM lParam);
BOOL InitThread(LPTHREAD_START_ROUTINE lpRoutine);

extern SOCKET g_csock;

extern HWND g_hMainWnd;
extern HWND g_hStatusBar;
extern HWND g_hToolBar;

HANDLE g_hMsgThread = INVALID_HANDLE_VALUE;

CWHQueue g_xMsgQueue;

static char WorkBuff[8192];
static int nWorkBuffLen;

LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam)
{
switch (WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
{
DWORD dwThreadIDForMsg = 0;

if (CheckSocketError(lParam))
{
dwThreadIDForMsg = 0;

if (InitThread(ThreadFuncForMsg))
{
KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);

SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 5000, (TIMERPROC)OnTimerProc);

InsertLogMsg(IDS_CONNECT_LOGINSERVER);
SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Connected"));
}
}
else
{
closesocket(g_csock);
g_csock = INVALID_SOCKET;

SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);
}

break;
}
case FD_CLOSE:
{
closesocket(g_csock);
g_csock = INVALID_SOCKET;

OnCommand(IDM_STOPSERVICE, 0);

break;
}
case FD_READ:
{
int nSocket = 0;
char *pszFirst = NULL, *pszEnd = NULL;

UINT nRecv = 0;

ioctlsocket((SOCKET)wParam, FIONREAD, (u_long *)&amt;nRecv);

if (nRecv)
{
char *pszPacket = new char[nRecv + 1];

nRecv = recv((SOCKET)wParam, pszPacket, nRecv, 0);

pszPacket[nRecv] = '\0';

if (!(g_xMsgQueue.PushQ((BYTE *)pszPacket)))
InsertLogMsg(_TEXT("[INFO] Not enough queue(g_xMsgQueue) buffer."));
}

break;
}
}

return 0L;
}

void SendExToServer(char *pszPacket)
{
DWORD dwSendBytes;
WSABUF buf;

buf.len = memlen(pszPacket) - 1;
buf.buf = pszPacket;

if ( WSASend(g_csock, &amt;buf, 1, &amt;dwSendBytes, 0, NULL, NULL) == SOCKET_ERROR )
{
int nErr = WSAGetLastError();
}
}