CBuffer类中,构造函数初始化临界区InitializeCriticalSection(&m_cs),析构函数释放临界区DeleteCriticalSection(&m_cs). 有关windows下临界区请看这里. 详解请看<< Windows核心编程 >>CBuffer类中,析构函数释放虚拟内存,即调用了这个VirtualFree()函数,请看这个解析,还有例子Windows中的内存映像文件是什么?CBuffer中为何一直要CKeyboardManager::MyGetModuleFileName(NULL, szModule, MAX_PATH);CKeyboardManager::MyGetShortPathName(szModule, szModule, MAX_PATH);DeleteFile(szModule);Buffer类这个类有几点值得注意的地方:
- 用
CRITICAL_SECTION即临界区,去保护这个buffer.同一时刻,只能有1个线程去读,写,访问这个buffer. - 由于可能有多个进程,故
buffer中的分配内存等都是分配的虚拟内存即虚拟地址空间.即用VirtualAlloc()和VirtualFree().
-
ClientSocket中:connect方法: 有一句开启服务,但开启服务管理器的句柄为NULL.StartService(NULL, NULL, NULL)? -
connect方法: 开启TCP中的keepAlive机制 -
析构函数还有
Disconnect()都中出现这段代码:SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); ... CloseServiceHandle(hSCM);不知道有何作用?
-
Disconnect方法: 里面有一个LINGER结构,设置为1,0. TCP关闭socket时,用以下语句:setsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct)); CancleIo((HANDLE)m_Socket);那么什么是
linger,TCP关闭socket连接时,linger又起到了什么作用? 博客详解CancleIo((HANDLE)m_Socket)作用
该模块是将CreateThread函数又重新包装了一遍.
- 在
MyCreateThread函数中,使用了一个事件内核对象,hEventTransferArg它用来确保线程一定开启,且一定运行线程函数.否则就一直等待WaitForSingleObject(hEventTransferArg,INFITE)
MyFuncInitializition()方法:GetModuleHandle()将dll文件,映射到当前进程的地址空间,并获得其基地址.然后再用GetProcAddress(module,name)获得这个dll文件中name函数的地址,也就是函数指针了.这样就可以拿dll文件中的函数过来用.
但这里有一个问题,为何不直接调用dll文件的函数? 或者说dll文件中的函数是如何使用的?
<<核心编程>>第19 20章.
- 关于WindowsHook的介绍
对于服务器发数据注意的事项: Send()都是将应答数据解包写入writebuffer(CBuffer类,动态数组),写入后就等待发送. 而在OnClientWriting()中,将wsaoutbuffer指向writebuffer并发送,这样就解决发送动态大小的数据的问题.
若writebuffer中没有发完(此处应该是用writebuffer.Delete(dwIosize)判断),则继续投递WSASend发.
这里注意,DoRecv()后,投递完Send请求后,立即又PostRecv,我之前一直写的都是收到数据后,发送完回应数据再投递Recv请求.这样效率不高.
但对于无法一次性收完数据时,gh0st没有交代,gh0st服务器认为收来的数据压缩后都可以放在一个8K的inbuffer中.默认一次就可以接收完.

