Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
ServerSockMsg.cpp
Package: LegendOfMir2_Server020418.zip [view]
Upload User: szopptop
Upload Date: 2013-04-23
Package Size: 1047k
Code Size: 4k
Category:
Game Server Simulator
Development Platform:
Visual C++
- #include "stdafx.h"
- void SendExToServer(char *pszPacket);
- extern SOCKET g_ssock;
- extern SOCKET g_csock;
- extern HWND g_hStatusBar;
- extern HANDLE g_hIOCP;
- CWHList<CSessionInfo*> g_xSessionList;
- 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);
- }
- //UINT WINAPI AcceptThread(LPVOID lpParameter)
- DWORD WINAPI AcceptThread(LPVOID lpParameter)
- {
- int nLen = sizeof(SOCKADDR_IN);
- char szMsg[64];
- SOCKET Accept;
- SOCKADDR_IN Address;
- while (TRUE)
- {
- Accept = accept(g_ssock, (struct sockaddr FAR *)&Address, &nLen);
- if (g_fTerminated)
- return 0;
- CSessionInfo* pNewUserInfo = (CSessionInfo*)GlobalAlloc(GPTR, sizeof(CSessionInfo));
- if (pNewUserInfo)
- {
- pNewUserInfo->sock = Accept;
- CreateIoCompletionPort((HANDLE)pNewUserInfo->sock, g_hIOCP, (DWORD)pNewUserInfo, 0);
- if (g_xSessionList.AddNewNode(pNewUserInfo))
- {
- int zero = 0;
- setsockopt(pNewUserInfo->sock, SOL_SOCKET, SO_SNDBUF, (char *)&zero, sizeof(zero) );
- // ORZ:
- pNewUserInfo->Recv();
- UpdateStatusBar(TRUE);
- szMsg[0] = '%';
- szMsg[1] = 'O';
- char *pszPos = ValToAnsiStr((int)Accept, &szMsg[2]);
- *pszPos++ = '/';
- pszPos = ValToAnsiStr((int)Address.sin_addr.s_net, pszPos);
- *pszPos++ = '.';
- pszPos = ValToAnsiStr((int)Address.sin_addr.s_host, pszPos);
- *pszPos++ = '.';
- pszPos = ValToAnsiStr((int)Address.sin_addr.s_lh, pszPos);
- *pszPos++ = '.';
- pszPos = ValToAnsiStr((int)Address.sin_addr.s_impno, pszPos);
- *pszPos++ = '$';
- *pszPos = '';
- SendExToServer(szMsg);
- }
- }
- }
- return 0;
- }
- //void CloseSession(CSessionInfo* pSessionInfo)
- void CloseSession(int s)
- {
- char szMsg[32];
- // Send close msg to login server
- //wsprintf(szMsg, _TEXT("%%X%d$"), s);
- szMsg[0] = '%';
- szMsg[1] = 'X';
- char *pszPos = ValToAnsiStr(s, &szMsg[2]);
- *pszPos++ = '$';
- *pszPos = '';
- SendExToServer(szMsg);
- closesocket(s);
- UpdateStatusBar(FALSE);
- }
- DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
- {
- DWORD dwBytesTransferred = 0;
- CSessionInfo* pSessionInfo = NULL;
- _LPTCOMPLETIONPORT lpPerIoData = NULL;
- char szPacket[DATA_BUFSIZE * 2];
- char szMsg[32];
- char *pszPos;
- while (TRUE)
- {
- if ( GetQueuedCompletionStatus(
- (HANDLE)CompletionPortID,
- &dwBytesTransferred,
- (LPDWORD)&pSessionInfo,
- (LPOVERLAPPED *)&lpPerIoData,
- INFINITE) == 0)
- {
- if (g_fTerminated)
- return 0;
- if (pSessionInfo)
- {
- szMsg[0] = '%';
- szMsg[1] = 'X';
- char *pszPos = ValToAnsiStr((int)pSessionInfo->sock, &szMsg[2]);
- *pszPos++ = '$';
- *pszPos = '';
- SendExToServer(szMsg);
- g_xSessionList.RemoveNodeByData(pSessionInfo);
- closesocket(pSessionInfo->sock);
- pSessionInfo->sock = INVALID_SOCKET;
- UpdateStatusBar(FALSE);
- GlobalFree(pSessionInfo);
- }
- continue;
- }
- if (g_fTerminated)
- return 0;
- if (dwBytesTransferred == 0)
- {
- szMsg[0] = '%';
- szMsg[1] = 'X';
- char *pszPos = ValToAnsiStr((int)pSessionInfo->sock, &szMsg[2]);
- *pszPos++ = '$';
- *pszPos = '';
- SendExToServer(szMsg);
- g_xSessionList.RemoveNodeByData(pSessionInfo);
- closesocket(pSessionInfo->sock);
- pSessionInfo->sock = INVALID_SOCKET;
- UpdateStatusBar(FALSE);
- GlobalFree(pSessionInfo);
- continue;
- }
- // ORZ:
- pSessionInfo->bufLen += dwBytesTransferred;
- while ( pSessionInfo->HasCompletionPacket() )
- {
- szPacket[0] = '%';
- szPacket[1] = 'A';
- pszPos = ValToAnsiStr( (int) pSessionInfo->sock, &szPacket[2] );
- *pszPos++ = '/';
- pszPos = pSessionInfo->ExtractPacket( pszPos );
- *pszPos++ = '$';
- *pszPos = '';
- SendExToServer( szPacket );
- }
- // ORZ:
- if ( pSessionInfo->Recv() == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING )
- {
- InsertLogMsg(_TEXT("WSARecv() failed"));
- CloseSession(pSessionInfo->sock);
- continue;
- }
- }
- return 0;
- }