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中.默认一次就可以接收完.