糖果派对官方网站_可以赌钱的糖果游戏_手机版
bb电子糖果派对Blocking/Non-Blocking VS Sync/Async VS Overlapped

bb电子糖果派对Blocking/Non-Blocking VS Sync/Async VS Overlapped

作者:网络编程    来源:未知    发布时间:2019-12-24 21:41    浏览量:

接收detoursHookIE11中WSARecvWSASendCreateThreadpoolIoStartThreadpoolIoCancelThreadpoolIo在IE11中有效此外Hook的其它API如WSAGetOverlappedResultGetQueuedCompletionStatusWaitForThreadpoolIoCallbacksGetQueuedCompletionStatusEx等等在IE11下就平昔不效劳,在HookWSARecv中现身难点了,作者做的hook是选择webbrowser进行的。在ie11中伊始展开网页时会现身一些个socket与closesocket的无多少操作的SOCKET在那前ie8的本子就好像没现身过,不知那是哪些原因。先说一下作者Hook的进度,IE11内核中socket的报导是通过完结端口举办的,首先是调用ws2_32.dll中的WSASocketAWSASocketW不经常二个SOCKET多个函数都步向了,那一个略带不知晓,再进来socket调用,这里为何WSASockesocket七个版本在同多个SOCKET上都会调用呢?步向CreateThreadpoolIo中创造SOCKET与IO的关联,那是要保留每豆蔻梢头对SOCKET与IO的数码还要加多少个回调地址。

[转发请评释:出自cnblogs,小编:byeyear,Email:east3@163.com]

SelGate服务器
注:顾客端从LoginSvr服务器得到SelGate服务器IP之后,连接SelGate服务器,举行角
色成立,删除,接受操作,然后发送数据到DBSrv服务器。
g_ssock Local 7100顾客端登录端口
g_csock Remote 5100发送到DBSrv服务器上的套接字

PTP_IO__stdcallMine_CreateThreadpoolIo(HANDLEfl,PTP_WIN32_IO_CALLBACKpfnio,PVOIDpv,PTP_CALLBACK_ENVIRONpcbe){charszBuf[255];PTP_IOrv=0;__try{//MyPTPFunrv=Real_CreateThreadpoolIo(fl,MyPTPFun,pv,pcbe);sprintf(szBuf,"CreateThreadpoolIo:S:0x%08xIO:0x%08xFUN:0x%08xrn",fl,rv,pfnio);HuiOutDebug(szBuf,_T("hookApi"));g_manage.BingSocketToIo(rv,(SOCKET)fl,(void*)pfnio);//这里就是保存操作。}__finally{};returnrv;}VOID__stdcallMyPTPFun(PTP_CALLBACK_INSTANCEInstance,PVOIDContext,PVOIDOverlapped,ULONGIoResult,ULONG_PTRNumberOfBytesTransferred,PTP_IOIo){charszBuf[255];PTP_WIN32_IO_CALLBACKpFun=(PTP_WIN32_IO_CALLBACK)g_manage.GetIoFun(Io);sprintf(szBuf,"MyPTPFun:IO:0x%08xFUN:0x%08xrn",Io,pFun);HuiOutDebug(szBuf,_T("hookApi"));if(pFun){g_manage.ProceIo(Io,Overlapped,Context,IoResult,NumberOfBytesTransferred);//先调用自的的回调函数,就是这里出现漏数据?????pFun(Instance,Context,Overlapped,IoResult,NumberOfBytesTransferred,Io);//然后是原回调函数}}//g_manage是一个保存数据的全局类,类中使用了CCriticalSectionm_sc;对所用操作进行了保护。

[二〇一二.10.08: 康健文章内容]

1.首先从SelGate.cpp WinMain分析:
1卡塔尔 CheckAvailableIOCP : 检查是还是不是NT,二〇〇二的系统(IOCP)
2卡塔尔 InitInstance: 起首化分界面,加载WSAStartup
3卡塔尔(英语:State of Qatar) MainWndProc窗口回调函数.
2.MainWndProc.CPP中解析回调函数MainWndProc
switch (nMsg)
{
case _IDM_CLIENTSOCK_MSG:
case WM_COMMAND:
case WM_CLOSE:
1)_IDM_CLIENTSOCK_MSG 消息:
拍卖与SelGate回调通信事件。
调用:OnClientSockMsg,该函数是一个回调函数:
当运维服务之后,ConnectToServer函数将(_IDM_CLIENTSOCK_MSG消息 FD_CONNECT|FD_READ|FD_CLOSE卡塔尔(英语:State of Qatar)传入WSAAsyncSelect函数。在与hWnd窗口句柄对应的窗口例程中以Windows新闻的款式接收互连网事件通报。函数OnClientSockMsg,首要产生与DBSrv服务器之间的通讯(心跳,转载客商端数据包等)
switch (WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
case FD_CLOSE:
case FD_READ:

跻身StartThreadpoolIo操作,也便是道具IO与SOCKET的一遍数据操作标准建设结构联系。连接操作不是WSAConnect与connect,是跻身connectEx,这几个函数的Hook相比费心,前边作者会注明这几个函数是怎么hook的,在IE第88中学在hookconnect时就能够出出多少个抓手的操作,send与recv,发送与选取的独有一个字节或未有字节,但IE11中只步向了recv,那么些send没步向,握手操作的发送数据据不知是怎么操作,那是怎么着来头吧?connectEx之后未有send或WSASend操作,直接走入了回调函数MyPTPFun,MyPTPFun之后并未有调用StartThreadpoolIo直接进去recv操作,有时recv与未有操作。连接建构后,再度步入StartThreadpoolIo进行设备IO与SOCKET的叁次数据操作创设联系。步向WSASend,好像这几个函数的操作能立时到位似的没进去回调MyPTPFun中,间接CancelThreadpoolIo撤废io达成端口的回调。再一次进入StartThreadpoolIo进行配备IO与SOCKET的叁回数据操作创建联系。然后正是WSARecv,这一个操作一时能即时成功直接CancelThreadpoolIo废除io完毕端口的回调。有时步入回调函数MyPTPFun,

正文首要讨论多少个在互连网编制程序中时常被钻探但也时常被误会的概念:

FD_CONNECT:(重新连接情况卡塔尔国
A. CheckSocketError重返正常时:
a卡塔尔(英语:State of Qatar). ConnectToServer函数首先在劳务运营的时候施行一次。回调
FD_CONNECT
b卡塔尔(英语:State of Qatar).连接DBSrv时,开启ThreadFuncForMsg线程,把从客商端发送的数量(g_xMsgQueue, FD_READ事件读到的DBSrv服务器发来的多寡卡塔尔投递I/O,利用IOCP模型,发送到顾客端。SleepEx挂起线程,至到三个I/O 达成回调函数被调用。八个异步进程调用排队到此线程。
ThreadFuncForMsg线程检查评定(从DBSrv收到的g_xMsgQueue数据包-心跳,管理包卡塔尔。i/o 投递,利用IOCP发送给顾客端。
if (nSocket = AnsiStrToVal(pszFirst + 1)) //得到socket
WSASend((SOCKET)nSocket, &Buf, 1, &dwSendBytes, 0, NULL, NULL);

int__stdcallMine_WSARecv(SOCKETa0,LPWSABUFa1,DWORDa2,LPDWORDa3,LPDWORDa4,LPWSAOVERLAPPEDa5,LPWSAOVERLAPPED_COMPLETION_ROUTINEa6){intrv=0;DWORDdw;DWORDdwLen,dwLen1;LPWSABUFlp;charszBuf[500];__try{rv=Real_WSARecv(a0,a1,a2,a3,a4,a5,a6);sprintf(szBuf,"WSARecv:s:0x%08xLen:%dlen:%drn",a0,0,a1[0].len);HuiOutDebug(szBuf,_T("hookApi"));g_manage.SetOp(a0,2,a1,a2,a5,a1[0].len);//这里进行了保存操作,以便观察对比;}__finally{};returnrv;}}

阻塞(Blocking),非阻塞(Non-Blocking),同步(Sync),异步(Async),重叠(Overlapped)。

c卡塔尔(英语:State of Qatar).终止放大计时器_ID_TIMER_CONNECTSERVER
KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);
d).设置_ID_TIMER_KEEPALIVE电磁打点计时器 (心跳数据包)
SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE
调用放大计时器回调函数On提姆erProc: 依期发关注跳多少包到DBSrv服务器。SendExToServer(PACKET_KEEPALIVE);

在上述的进程中,g_manage.BingSocketToIo对回调,达成设备IO,套接字创设了数据联系,g_manage.SetOp对接到或发送数据的LPWSAOVE索罗德L应用软件EDLPWSABUF指针举办了封存,以便取数或考察。个中在自己的回调中对LPWSABUF进行观测时现身了原来的数码未有了,那么些相应是new发生的,因为笔者对原WSARecvLPWSABUF布局中len进行了封存,发掘是1024,然则在MyPTPFun-g_manage.ProceIo实行比较时,原LPWSABUF指针结构中的len不是1024了是十分大的三个数,那是不容许的,结论就是原WSARecv中new发生的LPWSABUF被放飞了,因为调用MyPTPFun回调就代表WSARecv再次来到时,数据应该没接到,但在MyPTPFun时,原LPWSABUF又被假释了,那IE11在WSARecv再次来到与MyPTPFun回调间是用如何来取多少的呢?还会有此外的API吗?在MyPTPFun中,是本身先阅览,再调用IE11给的回调函数的。完结端口CreateThreadpoolIoStartThreadpoolIo的这套API还也可以有其余能取数吗?WaitForThreadpoolIoCallbacks这么些api未有进来过,GetQueuedCompletionStatus这一个API应该与CreateThreadpoolIo不是三个系统的吧!整个hook进程中对进入的APIWSASocketWWSASocketACreateThreadpoolIoStartThreadpoolIoconnectexrecvWSARecvWSASendsocketclosesocket进行了记事本输出观望。下边结出调用的历程WSASocketW:s:0x00000448WSASocketA:s:0x00000448CreateThreadpoolIo:S:0x00000448IO:0x0052f7a8FUN:0x7601dfb0StartThreadpoolIo:IO:0x0052f7a8connectex:s:0x00000448MyPTPFun:IO:0x0052f7a8FUN:0x7601dfb0StartThreadpoolIo:IO:0x0052f7a8WSASend:s:0x00000448Len:0len:770CancelThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:1024MyPTPFun:IO:0x0052f7a8FUN:0x7601dfb0StartThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:4096CancelThreadpoolIo:IO:0x0052f7a8StartThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:4096CancelThreadpoolIo:IO:0x0052f7a8StartThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:4096CancelThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:4096CancelThreadpoolIo:IO:0x0052f7a8StartThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:4096CancelThreadpoolIo:IO:0x0052f7a8StartThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:4096CancelThreadpoolIo:IO:0x0052f7a8StartThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:4096CancelThreadpoolIo:IO:0x0052f7a8recv:s:0x00000448Len:-1recv:s:0x00000448Len:-1StartThreadpoolIo:IO:0x0052f7a8WSASend:s:0x00000448Len:0len:867CancelThreadpoolIo:IO:0x0052f7a8WSARecv:s:0x00000448Len:0len:1024MyPTPFun:IO:0x0052f7a8FUN:0x7601dfb0WSASocketW:s:0x0000043cWSASocketA:s:0x0000043cCreateThreadpoolIo:S:0x0000043cIO:0x0052f688FUN:0x7601dfb0StartThreadpoolIo:IO:0x0052f688connectex:s:0x0000043cMyPTPFun:IO:0x0052f688FUN:0x7601dfb0recv:s:0x0000043cLen:-1recv:s:0x0000043cLen:-1StartThreadpoolIo:IO:0x0052f688WSASend:s:0x0000043cLen:0len:708CancelThreadpoolIo:IO:0x0052f688StartThreadpoolIo:IO:0x0052f688WSARecv:s:0x0000043cLen:0len:1024MyPTPFun:IO:0x0052f688FUN:0x7601dfb0StartThreadpoolIo:IO:0x0052f688WSARecv:s:0x0000043cLen:0len:4096CancelThreadpoolIo:IO:0x0052f688recv:s:0x0000043cLen:-1WSASocketW:s:0x00000354socket:s:0x00000354closesocket:s:0x00000354WSASocketW:s:0x00000354WSASocketA:s:0x00000354CreateThreadpoolIo:S:0x00000354IO:0x004d8f48FUN:0x7601dfb0StartThreadpoolIo:IO:0x004d8f48connectex:s:0x00000354MyPTPFun:IO:0x004d8f48FUN:0x7601dfb0recv:s:0x00000354Len:-1

首先要鲜明的是,独有那多少个会以致发生“数据传输”的函数(accept,connect,send,recv等)才存在此些概念;像bind、listen那一个不会引发“数据传输”的函数,是不真实“堵塞非窒碍”或“同步异步”那样的难题的。

B. 如果socket断开,设置_ID_TIMER_CONNECTSERVER定时器
ConnectToServer尝试重新连接服务器。
_ID_TIMER_CONNECTSERVER, (TIMERPROC)OnTimerProc);

附带一个比较首要的难题是,Non-Blocking和Async不是二次事。在局地论坛小说和关于网络编制程序的书中,将那多头如出生龙活虎辙,那是不科学的。

FD_CLOSE:
断开SOCKET连接,OnCommand(IDM_STOPSEQashqaiVICE, 0卡塔尔国; 回调函数管理IDM_STOPSERVICE。

  1. Blocking和Non-Blocking

case FD_READ:
选取DBSrv服务器发送的数据包(心跳,登入验证,selCur服务器地址),把多少插手缓冲区(g_xMsgQueue)中。

Blocking:唯有在函数所央求的操作完毕后,函数才会回到。举个例子,accept会等到连年队列非空才再次回到;recv会等到多少缓冲区中有数量后才回来。因而,blocking的意趣是,操作若无法到位函数就不回来。

WM_COMMAND:
IDM_STARTSE瑞鹰VICE: 运维服务(IOCP模型Server响应顾客端央浼卡塔尔(قطر‎
IDM_STOPSE奥迪Q3VICE: 结束服务(IOCP模型Server卡塔尔国
WM_CLOSE:
IDM_STOPSE汉兰达VICE: 停止服务(IOCP模型Server卡塔尔国
WSACleanup();
PostQuitMessage(0); //WM_DESTROY消息

Non-Blocking:假若操作无法即时到位,send/recv那样的函数将以败北再次来到,函数所诉求的操作不会拿走实施。同一时候WSAGetLastError函数将回到WSAEWOULDBLOCK。比方,假诺缓冲区中非常的少,recv会马上再次回到。在Non-Blocing情势下,程序能够经过三个循环不停调用recv,直到有数量可用。

IDM_STARTSE揽胜极光VICE: 运转服务(IOCP模型Server响应顾客端伏乞卡塔尔国
InitServerSocket:函数:
1) AcceptThread线程:
Accept之后生成多个CSessionInfo对象,pNewUserInfo->sock = Accept; 客商端Socket值赋值给构造体。记录顾客有关新闻。
新的套接字句柄用CreateIoCompletionPort关联达到成端口,然后发出三个异步的WSASend只怕WSARecv调用(pNewUserInfo->Recv(卡塔尔国;选择顾客端音讯卡塔尔(قطر‎,因为是异步函数,WSASend/WSARecv会马上再次来到,实际的出殡也许接受数据的操作由WINDOWS系统去做。然后把CSessionInfo对象加入g_xSessionList中。向DBsrv服务器发送客商Session消息。打包准则‘%0socket/ip$’
在客商accept之后,总投递三个I/O(recv卡塔尔(英语:State of Qatar),然后把相应的数码发往DBSrv服务器。

  1. Sync、Async和Overlapped

bb电子糖果派对,2) CreateIOCPWorkerThread函数:
调用CreateIoCompletionPort 并依靠微处理机数量,创设叁个或五个ServerWorkerThread线程。

Sync:App层的函数调用和OS底层的动作是逐生机勃勃的。比方,App调用recv -> OS实施recv -> 推行到位 -> 函数再次来到。

ServerWorkerThread线程职业规律:
循环调用GetQueuedCompletionStatus(卡塔尔(英语:State of Qatar)函数来博取IO操作结果。窒碍函数。当WINDOWS系统完结WSASend恐怕WSArecv的操作,把结果发到完结端口。GetQueuedCompletionStatus(卡塔尔(英语:State of Qatar)马上再次来到,并从到位端口获得刚完毕的WSASend/WSARecv的结果。然后随着产生WSASend/WSARecv,并接二连三下叁次巡回不通在GetQueuedCompletionStatus(卡塔尔国这里。
a卡塔尔(قطر‎. pSessionInfo为空可能dwBytesTransferred =0 ,在客商端close socket,发相应数据包(极度)到DBSrv服务器(X命令-数据包卡塔尔(قطر‎,关闭顾客端套按字。
b卡塔尔(英语:State of Qatar). while ( pSessionInfo->HasCompletionPacket(卡塔尔(قطر‎ )要是数据注脚正确,就转载数据包(A命令-数据包卡塔尔 DBSrv服务器。
c卡塔尔. if (pSessionInfo->Recv(卡塔尔国 继续投递I/O操作。
总结:
作者们不停地产生异步的WSASend/WSARecv IO操作,具体的IO管理进度由WINDOWS系统完毕,WINDOWS系统完毕实际的IO管理后,把结果送到变成端口上(即使有五个IO都成功了,那么就在成就端口这里排成贰个队列)。大家在其余二个线程里从不负众望端口不断地抽出IO操作结果,然后依据供给再发生WSASend/WSARecv IO操作。

下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.tk-web.com. bb电子糖果派对有限公司 版权所有