如何添加keepalive
7.2.6 KeepAlive的添加
下面是KeepAlive模块的添加,KeepAlive模块指的是在客户端电脑电源突然中断的情况下,为了确认客户端是否结束而定期传送的信号。
如果出现了上面的情况,IOCP或者EventSelect无法测试OnIoDisconnected,因此必须定期传送数据包通过确认是否传送失败来确认是否访问中断。
(ConnectedSession.h)
#pragma once
//继承CPacketSession的CConnectedSession
class CConnectedSession : public CPacketSession
{
. . .
BOOL ReStart (SOCKET hListenSocket ) ;
//设置并获得m_bConnected值的函数
VOID SetConnected(BOOL bConnected) { CThreadSync Sync ; m_bConnected = bConnected; }
BOOL GetConnected(VOID) { CThreadSync Sync; return m_bConnected; }
private:
//判断是否被访问的变量
BOOL m_bConnected
}; (ConnectedSession.cpp)
CConnectedSession: :CConnectedSession(VOID)
{
//判断是否被访问的变量
m_bConnect ed = FALSE;
} (ConnectedSessionManager.h)
#pragma once
//管理ConnectedSession的类
//为了在多线程环境中使用更加稳定,继承CMultiThreadSync
class CConnectedSessionManager : public CMultiThreadSync《 CConnectedSessionManager》
{
. . .
VOID End(VOID) ;
//给访问的所有ConnectedSession传送数据包的函数
VOID WriteAll (DWORD dwProtocol , BYTE *pData , DWORD dwLength) ;
private:
. . .
};
(ConnectedSessionManager.cpp)
//给访问的所有Session传送数据的函数
VOID CConnectedSessionManager : :WriteAll (DWORD dwProtocol ,
BYTE *pData, DWORD dwLength)
{
//同步对象
CThreadSync Sync ;
//对访问的所有对象进行WritePacket
for (DWORD i =0;i 《m_vConnectedSessions.size() ;i ++)
{
//只对访问中的对象进行WritePacket
if (m_vConnectedSessions[i ] -》GetConnected())
m_vConnectedSessions[i ] -》WritePacket (dwProtocol , pData, dwLength) ;
}
}
(ServerIocp.h)
#pragma once
//继承CIocp
class CServerIocp : public CIocp
{
. . .
VOID End(VOID) ;
//KeepAlive Thread Callback函数
VOID KeepThreadCallback(VOID) ;
. . .
CConnectedSessionManager m_oConnectedSessionManager ;
//管理KeepAlive Thread的句柄
HANDLE m_hKeepThread; //结束KeepAlive Thread时使用的事件
HANDLE m_hKeepThreadDestroyEvent ;
};
(ServerIocp.cpp)
//KeepAlive Thread Callback函数
DWORD WINAPI KeepThreadCallback(LPVOID pParameter)
{
CServerIocp *pOwner = (CServerIocp*) pParameter ;
pOwner-》KeepThreadCallback() ;
return 0;
}
VOID CServerIocp: :KeepThreadCallback(VOID)
{//KeepAlive信号
DWORD dwKeepAl ive = 0xFFFF;
while (TRUE)
{
//30秒内结束事件没有出现的话,将跳过
DWORD dwResult = WaitForSingleObject (m_hKeepThreadDestroyEvent , 30000) ;
//结束时间出现的情况下,结束Thread
if (dwResult == WAIT_OBJECT_0) return;
//给访问中的所有Session传送数据包
m_oConnect edSessionManager .WriteAll (0x3000000,
(BYTE*)&dwKeepAlive , sizeof (DWORD)) ;
}
}
//CIocp的假想函数
VOID CServerIocp: :OnIoConnected(VOID *pObject )
{
. . .
pConnectedSession-》SetConnected(TRUE) ;
}
VOID CServerIocp: :OnIoDisconnected(VOID *pObject )
{
. . .
pConnectedSession-》SetConnected(FALSE) ;
}
BOOL CServerIocp: :Begin(VOID)
{
. . .
//创建KeepAlive结束事件
m_hKeepThreadDestroyEvent = CreateEvent (NULL, FALSE, FALSE, NULL) ;
if ( !m_hKeepThreadDestroyEvent )
{
//失败的情况下结束
CServerIocp: :End() ;
return FALSE;
}
//创建KeepAlive Thread
m_hKeepThread = CreateThread(NULL, 0, : :KeepThreadCallback, this, 0, NULL) ;
if ( !m_hKeepThread)
{
//创建失败的情况下结束
CServerIocp: :End() ;
return FALSE;
}
return TRUE;
}
VOID CServerIocp: :End(VOID)
{//结束CServerIocp的时候
//m_hKeepThread不是NULL的话,结束KeepAlive Thread
if (m_hKeepThread)
{
//出现结束事件
SetEvent (m_hKeepThreadDestroyEvent ) ;
//等待至Thread结束为止
WaitForSingleObject (m_hKeepThread, INFINITE) ;
//关闭句柄
CloseHandle(m_hKeepThread) ; m_hKeepThread = NULL;
}
//如果KeepAlive结束事件不是NULL的话
if (m_hKeepThreadDestroyEvent )
{
//关闭事件
CloseHandle(m_hKeepThreadDestroyEvent ) ; m_hKeepThreadDestroyEvent = NULL;
如何在winkawaks街机模拟器中添加游戏包
在winkawaks街机模拟器中添加游戏包,以冒险岛游戏为例,具体操作步骤如下。
1、在游戏目录找到“roms”目录,添加冒险岛文件名称“neogeo”。如下图所示。
2、获得“neogeo”这个bios文件放进去。如下图所示。
3、然后获得“preisle2”这个游戏文件放进去,这样原始岛这个游戏就添加成功。如下图所示。
4、接在来打开模拟器,点击载入游戏。如下图所示。
5、点击扫描所有游戏。如下图所示。
6、最后,游戏成功运行。如下图所示。
如何在快速启动栏添加“显示桌面”
方法一:
在任务栏上点击鼠标右键选择“显示桌面”
方法二:
按下Win+D快捷键就可以把主屏幕的所有窗口最小化
方法三:
用鼠标抓住当前窗口摇晃几次,除了当前窗口之外的窗口都最小化了,这个可是Win7的特色
比较复杂的是方法四:建立仿XP中的“显示桌面”
首先讲下原理,代码和XP是一样,不同就是在Win7下不能直接拖入任务栏,不然达不到XP中的效果。我们随便找个程序的快捷方式,然后修改它的图标及链接位置,接下来只记锁定到任务栏就可以了。
1,随便找个程序的快捷方式,比如我找的是Media Player,在图标上右击选择【属性】—【更改图标】,将【查找此文件中的图标】下的路径删除并回车,这时就可以显示所有图标了,然后选择显示桌面的图标,接着右击选择“锁定到任务栏”。
2,在桌面上新建记事本,把下面的代码复制进去,然后点【另存为】,保存类型为:所有文件,文件名为:显示桌面.scf。然后将该文件放到一个你认为不碍眼的地方,比如我放到C盘根目录,路径为C:\显示桌面.scf。[Shell]Command=2IconFile=%SystemRoot%system32SHELL32.dll,34[Taskbar]Command=ToggleDesktop
3,打开【计算机】—【组织】—【文件夹和搜索选项】—【查看】—【隐藏文件和文件】选项,然后选择【显示隐藏的文件、文件夹和驱动器】,设置完后打开该路径C:\用户\你的用户名\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar。这时我们可以看到被我们改过的Media Player图标,这时我们在图标上右击选择【属性】,将【目标】改成C:\显示桌面.scf,当然如果你放在了别的地方,就换成你的路径。
4,好了,仿XP中的“显示桌面”完成。
-keepalive